虛函數(shù)加vritual關(guān)鍵字尘颓,目的是為了實(shí)現(xiàn)多態(tài)性兄春,可以通過基類的指針和引用調(diào)用派生類的對象疯趟,從而產(chǎn)生不同的效果。
#include<iostream>
using namespace std;
class Base1{
public:
virtual void display() const=0;//虛函數(shù)
};
class Base2:public Base1{
public:
void display() const;//覆蓋基類的虛函數(shù)
};
void Base2::display() const{
cout<<"Base2::display()"<<endl;
}
class Derived:public Base2{
public:
void display() const;//覆蓋基類的虛函數(shù)
};
void Derived::display()const{
cout<<"Dervied::display()"<<endl;
};
void fun(const Base1 *p){
p->display();
}
int main(){
Base2 base2;
Derived derived;
fun(&base2);
fun(&derived);
return 0;
}
image.png
純虛函數(shù)不能在定義類中實(shí)現(xiàn)谋梭,但應(yīng)該在能夠?qū)嵗呐缮愔袑?shí)現(xiàn)信峻。定義了純虛函數(shù)的類為抽象類。
#include<iostream>
using namespace std;
class Base1{
public:
virtual void display() const=0;//純虛函數(shù)
};
class Base2:public Base1{
public:
void display() const;//覆蓋基類的虛函數(shù)
};
void Base2::display()const{
cout<<"Base2"<<endl;
}
class Derived:public Base2{
public:
void display()const;//覆蓋基類的虛函數(shù)
};
void Derived::display()const{
cout<<"Derived"<<endl;
}
void fun(const Base1 *p){//參數(shù)為指向基類對象的指針
p->display();
}
int main(){
Base2 b;
Derived d;
fun(&b);
fun(&d);
return 0;
}
虛基類:虛基類是指虛繼承中的基類.
#include<iostream>
using namespace std;
class Base0{//定義基類
public:
Base0(int v):var0(v){}
int var0;
void show() const{
cout<<var0<<endl;
}
};
class Base1:virtual public Base0{//Base0為虛基類
public:
Base1(int v):Base0(v){}
~Base1(){}
};
class Base2:virtual public Base0{//Base0為虛基類
public:
Base2(int v):Base0(v){}
};
class Derived:public Base1,public Base2{
public:
Derived(int v):Base1(v),Base2(v),Base0(v){}//構(gòu)造函數(shù)要從最遠(yuǎn)派生類賦值
~Derived(){}//析構(gòu)函數(shù)和普通類的構(gòu)造函數(shù)沒區(qū)別
};
int main(){
Derived d(2);
d.var0;
d.show();//直接調(diào)用虛基類的函數(shù)
return 0;
}