我有与虚拟基类有关的问题。
class a
{
public:
a();
~a();
};
class b: virtual public a
{
public:
b();
~b();
};
class c: virtual public a
{
public:
c();
~c();
};
class e: public b, c
{
public:
e();
~e();
};
每当我创建一个类e
的对象时,a
将通过哪个类创建e
对象?
答案 0 :(得分:2)
两者都将被分享。
如果您的问题与布局有关,则未指定。是的,虚拟继承到位,一个对象 - 当它不是一个完整的对象 - 在内存中可能是不连续的。
如果a没有默认构造函数,则需要e中的初始化列表,它将提供所需的参数; b和c的构造函数隐含的那些将被忽略。
答案 1 :(得分:1)
将出现一个共享实例。
编译器将为B类和C类提供vpointer,因为在运行时,A的内存偏移量是未知的。当您创建E的实例时,它还将创建A,B和C的实例。
B和C都在其vtable中包含一个虚拟指针,用于存储A类的偏移量,这将在运行时用于指向共享的A对象。