样本代码内部机构:的在C++虚拟继承
class A {
public:
A(int) {}
};
class B : public virtual A {
public:
B(int b) : A(b) {}
};
class C : virtual public A {
public:
C(int c) : A(c) {}
};
class D : public B, public C {
public:
D() : B(1), C(2){};
};
这是金刚石问题典型代码(溶液)。我知道为什么使用virtual关键字。但编译器处理这个问题的内部机制并不为我所知。现在我已经遇到了关于所述机制的两种不同理论,如下所述。
当一个类用virtual关键字继承时,编译器会在派生类中添加一个虚拟基指针。我已经检查过派生类的大小,并且它包含了一个额外指针的大小。但是我不知道它指向的是什么,当上面例子中的类D中的成员被引用时它是如何工作的。
对于每个构造函数,编译器会为程序员提供的每个定义创建两个版本。必须从this link 在上面的代码中。 编译器将产生2个版本C的构造的
C(int){} // Version1 C(int):A(int){} // Version2
和两个不同版本的构造B的
B(int){} // Version1 B(int):A(int){} // Version2
因此,当d被构造然后编译器将生成任一下面的代码的
D() : B(), C(2) {} // Version1 D() : B(1), C() {} // Version2
为了确保只创建了A的一个实例,因此避免了A的副本。
请帮我理解内部机制。
@Ron标记之前请先阅读实际文章 – George
@ paper.plane这个问题可能对SO有点理论......虚拟继承的实际实现依赖于编译器......看看实际的标准是什么说:看看:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf在231页 – George
@ Ron再次,我想你可能没有读过这个问题,只是Google搜索标题...op似乎并不想知道虚拟是做什么的(或虚拟基类是做什么的),而是产生所述类和继承类的内部对象模型的方式和原因 – George