虛繼承和虛函數

update:6/6,面向對象程序設計

虛函數

在一個基類中聲明一個函數爲virtual類型,即virtual void Run();那麼這個函數就是虛函數,

作用:實現多態父類型別的指針指向其子類的實例,然後通過父類的指針調用實際子類的成員函數

我這裏是

class vehicle{
public:
    int MaxSpeed;
    int Weight;
    virtual void Run(){
        cout<<"NMSL1\n";
    };
    void Stop(){};
};

class bicycle:public vehicle{
public:
    int Height;
    void Run(){
        cout<<"NMSL2\n";
    };
};

class motorcar:public vehicle{
    public:
    int SeatNum;
    void Run(){
        cout<<"NMSL3\n";
    };
};

然後通過父類指針指向子類實例

vehicle vc,*VC;
bicycle bc;
motorcar mc1;

VC=&vc;
VC->Run();

VC=&bc;
VC->Run();

VC=&mc1;
VC->Run();

結果是

NMSL1
NMSL2
NMSL3

如果之前我不聲明Run爲虛函數,那麼結果是:

NMSL1
NMSL1
NMSL1

虛函數最關鍵的特點是“動態聯編”,它可以在運行時判斷指針指向的對象,並自動調用相應的函數。

 

虛繼承

上面說到,虛函數是在基類中聲明,而虛繼承不一樣,虛繼承是在一代子類中聲明繼承方式爲虛繼承。

class bicycle:virtual public vehicle{
public:
    int Height;
    void Run(){
        cout<<"NMSL2\n";
    };
};

class motorcar:virtual public vehicle{
    public:
    int SeatNum;
    void Run(){
        cout<<"NMSL3\n";
    };
};

虛繼承的作用是:

虛繼承 是面向對象編程中的一種技術,是指一個指定的基類,在繼承體系結構中,將其成員數據實例共享給也從這個基類型直接或間接派生的其它類。

虛擬繼承是多重繼承中特有的概念。虛擬基類是爲解決多重繼承而出現的。

類D繼承自類B1、B2,而類B1、B2都繼承自類A,加入不說明B1\B2繼承A的方式,會導致D調用A的函數時出現二義性,不知道是B1繼承的A還是B2繼承的A,這時候需要引入虛繼承。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章