【问题标题】:Virtual base class object creation虚拟基类对象创建
【发布时间】:2012-06-20 12:36:44
【问题描述】:

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

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 中创建?

【问题讨论】:

  • 没有一个。虚拟基类与从它们继承的类“分离”(这实际上是虚拟继承的本质)。您甚至可以调用a 的非默认构造函数,例如:e::e() : a(bla), b(), c() { ... }

标签: c++ virtual-functions


【解决方案1】:

两者都会共享。

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

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

【讨论】:

    【解决方案2】:

    将存在一个共享实例。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 2021-08-11
      • 2015-07-05
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多