0

I have question related to virtual base class.

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();
};

Whenever I create an object of class e, via which class the a object will be created in e?

4

2 回答 2

2

两者,它将被共享。

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

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

于 2012-06-20T12:40:48.197 回答
1

将存在一个共享实例。

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

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

于 2012-06-20T13:03:23.583 回答