首先繼承,多型,虛函式,我們先了解一下各位的關係。
繼承是子類繼承父類,完成基礎功能的獲取,當然繼承有三種許可權,public,protect和private,如果不加許可權限定,預設繼承是私有繼承。
許可權表如下:
所以可以看到凡私有成員,子類都不能用,不過有方法能用,這裡不討論。
多型:實際上就是通過繼承實現的,函式的多型性是指乙個函式被定義成多個不同引數的函式。當你呼叫這個函式時,就會呼叫不同的同名函式。當然是不同的物件,也就是不同的類進行了虛函式的重寫。
虛函式:虛函式有兩種,一種是純虛函式,一種是就是非純虛函式。純虛函式只要申明一下,不需要定義,但非純虛函式是需要定義的(實現的)。只要包含有純虛函式的類,就稱為抽象類。抽象類是不能被例項化的。
虛函式的申明:
虛函式
父類:virtual void getsize() const;
子類:void getsize() const override;
純虛函式:
父類:virtual void pest_virt() const = 0;
子類:void pest_virt() const override;
上面的const可以去掉,加上去的意思據說是防止過載,也就是防止引數變化
這裡以幾段**試了一下:
定義兩個類,annimal和pest
#ifndef duotaijingtai_animal_h
#define duotaijingtai_animal_h
#include class animal ; ///申明建構函式不能沒有中括號,否則會報錯,未定義的annimal,很懵逼
~animal(){};
static void print(std::string &a);
void gettpye();
static std::string type;
virtual void getsize() const;
virtual void who() ;
};class cat:animal;
void getsize() const override;
void who() ;
void claw();
};class pest;
virtual void pest_virt()=0;
};class worm:public pest;
virtual void pest_virt() override;
};#endif //duotaijingtai_animal_h
其中annimal是普通的基類,pest是抽象類
下面是兩個類的定義
#include #include "../include/animal.h"
void animal:: print(std::string &a)
下面是輸出的結果,符合意料之中:
hello delete
changed in print
changed in get type
hello delete change
changed in get type
changed in get type
cat size
i am cat
i am a worm
那麼如何實現多型c++中的多型是用虛函式實現的: 子類覆蓋父類的虛函式, 然後宣告乙個指向子類物件的父類指標,聽起來有些拗口,實際上很簡單,操作一下
如base *b = new derive();
當呼叫b->f()時, 呼叫的是子類的derive::f(),如果f()沒有被重寫,那麼結果是一樣的,如果被重寫了,那麼就會實現子類的功能。
用我上面的code示例:
animal *unkown = new cat();
unkown->who();
輸出的結果是i am a cat,當有多個子類的時候,那麼就可以實現多中動物的描述,但是注意:這時候的父類指標只能呼叫父類內部有的成員,如果成員是在子類新建立的,那麼將無法呼叫。
比如我用unknow呼叫cat的claw成員函式
unkown->claw();
編譯器直接報錯:以上。我是通過這些**熟悉了上述三個名詞的關係,我覺的看再多還是要實際動手,當然我這只是入門級的理解,不過慢慢來,c++primer多看看,多寫**,自然就理解深刻了,加油,c++的同志們 C 虛函式和多型繼承
指標和引用是很好理解的,變數的引用相當於給變數取了個別名,在函式呼叫時,傳引用是會將引數列表的值改變的。include using namespace std int main 最終輸出的結果都是0x7ffdd9aff7b4,即為記憶體中儲存整型變數m的位址。對於虛函式,它是實現多型公有繼承的關鍵。...
C 繼承中的多型 虛函式 虛析構函式
從c 繼承中的相容原則中我們知道 父類指標可以直接指向子類物件,父類引用可以直接引用子類物件。當父類和子類有相同方法時呼叫的是父類方法,即是根據指標型別或引用型別來確定呼叫的方法型別的。如果我們想根據指標實際指向的物件型別 引用實際引用的型別 來決定呼叫的方法型別,需要把這個函式宣告為虛函式,這就是...
C 繼承 多型 虛函式
c 支援多繼承 class parent class parent2 class child public parent,private parent2公有繼承和私有繼承的區別 public parent 公有繼承,private和public都會繼承 private parent 私有繼承,只繼承...