1、虚继承
应用场景:当出现菱形继承的时候,应当采用虚继承
eg:
class A
{
A(){cout<<"A";}
~A(){cout<<"A-";}
}
class B:public A
{
B(){cout<<"B";}
~B(){cout<<"B-";}
}
class C:public A
{
C(){cout<<"C";}
~C(){cout<<"C-";}
}
class D:public B,public C
{
D(){cout<<"D";}
~D(){cout<<"D-";}
}
int main(){
D d;
}
B和C继承于A,D同时继承B与C;这将导致 A被多次构造与析构;需要用virtual即可解决问题。
2、虚函数
应用场景:为了重写某一个类中的 函数,需要用到 virtual。
class a
{ public:
void f(){
cout<<"223";}
}
class b :public a
{ public:
void f(){
cout<<"113";}
}
int main()
{
a *ss=new b();
ss->f();
delete ss;
}
这个时候 ss调用f函数将会打印 父类的f函数,如果用到了 virtual;这个将打印对象的 f函数(即为 子类的f函数)。