虚拟基类对象创建

时间:2012-06-20 12:36:45

标签: c++ virtual-functions

我有与虚拟基类有关的问题。

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对象?

2 个答案:

答案 0 :(得分:2)

两者都将被分享。

如果您的问题与布局有关,则未指定。是的,虚拟继承到位,一个对象 - 当它不是一个完整的对象 - 在内存中可能是不连续的。

如果a没有默认构造函数,则需要e中的初始化列表,它将提供所需的参数; b和c的构造函数隐含的那些将被忽略。

答案 1 :(得分:1)

将出现一个共享实例。

编译器将为B类和C类提供vpointer,因为在运行时,A的内存偏移量是未知的。当您创建E的实例时,它还将创建A,B和C的实例。

B和C都在其vtable中包含一个虚拟指针,用于存储A类的偏移量,这将在运行时用于指向共享的A对象。