-4

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

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

我知道在使用虚拟继承的菱形结构中使用虚拟继承只创建了大多数基类的一个副本,但虚拟在线性继承中究竟做了什么。

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

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

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

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

4

1 回答 1

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's 的构造函数。唯一合理的候选人是Derived2

于 2012-05-10T14:38:17.480 回答