关于类的多重继承中的二义性问题
类的多重继承:一个类同时继承多个父类的属性和行为;
多重继承的二义性:在多重继承中,派生类直接继承的某个父类不能再次出现,但是间接继承的父类可以,在访问派生类成员时会出现一个对象有多个同名的成员数据或成员函数;
虚基类:在继承定义中包含了virtual关键字的继承关系;
详解一下多重继承的二义性,先给出一个例子:
#include <iostream> class base { public: base(){std::cout << "constructor base" << std::endl;} ~base(){std::cout << "destructor base" << std::endl;} void Get(){std::cout << "base" << std::endl;} }; class A : public base { public: A(){std::cout << "constructor A" << std::endl;} ~A(){std::cout << "destructor A" << std::endl;} void Get(){std::cout << "A" << std::endl;} }; class B : public base { public: B(){std::cout << "constructor B" << std::endl;} ~B(){std::cout << "destructor B" << std::endl;} void Get(){std::cout << "B" << std::endl;} }; class C : public B { public: C(){std::cout << "constructor C" << std::endl;} ~C(){std::cout << "destructor C" << std::endl;} void Get(){std::cout << "C" << std::endl;} }; class D : public A, public C { public: D(){std::cout << "constructor D" << std::endl;} ~D(){std::cout << "destructor D" << std::endl;} void Get(){std::cout << "D" << std::endl;} }; int _tmain(int argc, _TCHAR* argv[]) { D* d = new D(); delete d; return 0; }
输出的结果:
constructor base
constructor A
constructor base
constructor B
constructor C
constructor D
上面的列子就是典型的多重继承的二义性,类base被间接继承两次,这将导致D类型的指针无法强制转换为base类型的指针。如果解决这个问题?
答案:在继承具有二义性的父类前面加上virtual。
下面留给大家一个问题,如果只在A类继承base时加上virtual,或者只在B类继承base时加上virutal,输出的结果将会怎样?