如果一个派生类有多个基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接数据成员的多份同名成员。
使用虚基类可使最终的派生类只保留共同基类的一份同名成员。
一般情况下,派生类的构造函数只需负责对其直接基类初始化,再由直接基类负责对间接基类初始化。
对虚基类的派生类:在最后的派生类中不仅要负责对其直接基类进行初始化,还要对虚基类初始化。
代码一:
#include <iostream> using namespace std; class A { public: A(){cout<< 'a';} int a; }; class B: public A { public: B(){cout<< 'b';} int b; }; class C: public A { public: C(){cout<< 'c';} int c; }; class D: public B, public C { public: D(){cout<< 'd';}; int d; }; int main() { D d; return 0; } //abacd
代码二:
<pre name="code" class="cpp">#include <iostream> using namespace std; int t= 0; class A { public: A(){cout<< 'a'; t++;} int a; }; class B: virtual public A { public: B(){cout<< 'b';} int b; }; class C: virtual public A { public: C(){cout<< 'c';} int c; }; class D: public B, public C { public: D(){cout<< 'd';}; int d; }; int main() { D d; cout<< t; return 0; } //abcd1
那么这里类B和类C的构造函数会不会调用虚基类的构造函数A呢?
不会, 因为C++编译相同只执行最后的派生类对虚基类的构造函数的调用,而忽略基类的其他派生类对虚基类的构造函数的调用