编译器对虚拟继承的处理可参考《深度探索C++对象模型》Data语义学部分。
class Base {
public:
Base() {
cout << "Base() is called!" << endl;
}
virtual void f() {}
};
class A : public Base {
public:
A() {
cout << "A() is called!" << endl;
}
virtual void f() {}
};
class B : public Base {
public:
B() {
cout << "B() is called!" << endl;
}
virtual void f() {}
};
class C :public A, public B {
public:
virtual void f() {}
};
int main() {
C objC;
objC.f();}
Base类的构造函数被调用了两次,即生成了两份Base类对象。
将B和C改成虚继承于Base: class A : public virtual Base, class B :public virtual Base, 则会只生成一份Base类对象。
Note:
将C改成虚继承于B和A: class C :virtual public A,virtual public B, 不起作用。