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

Why virtual base class constructors called first?

本文关键字:基类 构造函数 虚拟 调用 为什么      更新时间:2023-10-16

可能的重复项:
在C++中,什么是虚拟基类?
虚拟继承

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

我知道使用虚拟继承

就像在钻石结构中使用虚拟继承一样,只会创建大多数基类的一个副本,但是虚拟在线性继承中究竟在做什么。

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

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

还有虚拟继承情况下的对象布局是什么?

有人能解释一下C++这种行为背后的逻辑吗?

虚拟继承可以说是默认值。 如果我写像这样:

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

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

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

,该类仍然明确地意味着是一个基类 - 它只有实现了接口的一部分。 在这种情况下,继承应该是虚拟的,因为我不知道(或者不想强加一种解决方案)g()的实施是否会进一步派生类,或姊妹类(混合技术)。 因此

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.