为什么虚拟基类构造函数首先调用?

时间:2012-05-10 14:23:35

标签: c++ inheritance virtual

  

可能重复:
  In C++, what is a virtual base class?
  virtual inheritance

为什么从大多数派生类调用虚拟基类的构造函数......在继承层次结构中,首先创建虚拟基类的对象...这背后的逻辑是什么?

据我所知,在使用虚拟继承的菱形结构中使用虚拟继承只创建了最基类的一个副本,但是在线性继承中虚拟做了什么。

class A{};
class B : virtual public A {};  
class C : virtual public B {};

我们尝试使用这种继承实际上实现了什么?

虚拟继承的对象布局是什么?

有人可以用C ++解释这种行为背后的逻辑吗?

1 个答案:

答案 0 :(得分:2)

虚拟继承应该是默认的。如果我写 类似的东西:

class Base
{
public:
    virtual ~Base() {}
    virtual void f() = 0;
    virtual int g() const = 0;
    //  ...
};

,很明显这个类是继承的。如果我以后 写:

class Middle : public virtual Base
{
public:
    virtual void f();  
};

,这个类显然仍然是一个基类 - 它只有 实现了界面的一部分。在这种情况下,继承 应该是虚拟的,因为我不知道(或者不想强加 一个解决方案)g()的实施是否会更进一步 派生类,或姐妹类(mixin-technology)。因此,

class Derived1 : public Middle
{
public:
    virtual int g() const;
};

没有指令,但是Middle的作者并不知道这会是 这个案子,并不想禁止:

class M2 : public virtual Base
{
public:
    virtual int g() const;
};

class Derived2 : public Middle, public M2
{
};

考虑到这样的层次结构,应该调用Base的构造函数。该 只有合理的候选人是Derived2