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,這時候需要引入虛繼承。