1.单一继承下的虚函数(待更新)
2.多重继承下的虚函数
多重继承讲给虚函数带来很大的问题,主要有三点:
1.虚析构函数:
析构函数一般都是虚函数,不然删除某个指向派生类的基类指针将不会析构派生类的内容。
首先关于多重继承:
如以下这个关系:
A与B同级,C分别继承这两个类。
如果A* a=new C;
B* b=new C;
则通过a只能调用displayA();
通过b只能调用displayB();
也就是说b->displayA()这样是非法的。
然后是关于多重继承对虚析构函数的影响。
现在A是基类中最左边的类,如果我们
A* a=new C;
现在a指向的实际上是现在这个对象地址的最起始处,而如果我们
B* b=new C;
现在b指向的起始是类中B subobject处,也就是说使用B类作为基类指针的话指向的不是起始处。
但是当我们调用析构函数时,比如delete b时,此时应该将b再调整至类的起始地址处。
在单一继承时候是不存在这个问题的,因为只有一个基类,指针也一直指向类的起始地址,而当加入多重继承,且经由非最左边的类的指针来delete时,需要在delete前将指针在调整至类的起始处,因为一开始b并不是指向起始,而是指向B subobject处的。
class A { public: virtual ~A() { cout<<"a bybye"<<endl; } virtual void displayA() { cout<<"a"<<endl; } }; class B { public: virtual ~B() { cout<<"b byebye"<<endl; } virtual void displayB() { cout<<"b"<<endl; } }; class C:public A,public B { public: ~C() { cout<<"c bye bye"<<endl; } };