【问题标题】:Why virtual base class constructors called first? [duplicate]为什么首先调用虚拟基类构造函数? [复制]
【发布时间】:2012-05-19 03:34:32
【问题描述】:

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

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

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

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

使用这种继承实际上我们试图达到什么目的?

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

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

【问题讨论】:

  • 这是你的第 12 个问题,到现在为止你应该知道如何在问题中使用正确的格式。
  • 问题不清楚。你问为什么先调用A的构造函数?
  • 您基本上是在寻求有关虚拟继承的教程。这在许多其他问题和几个在线教程中都有涉及。 SO 不是您的 Google。
  • Kunal:我没有给你投反对票,但我敢猜测你为什么在这里被投反对票。 1)这里的问题太多了。 2)这看起来像一个意识流和Stack Overflow is not your personal research assistant,3)你正在使用虚拟继承并问为什么要使用虚拟继承。如果你不知道,他们为什么要使用它? (与 #2 基本相同) 4) 您没有努力正确地格式化您的问题 - 其他用户不得不反复编辑您的帖子以使其易于阅读。
  • @penelope:人们总是为他做事,他为什么要打扰?

标签: c++ inheritance virtual


【解决方案1】:

虚拟继承可以说是默认的。如果我写 类似:

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

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2012-02-28
    • 2010-09-13
    • 2011-09-21
    相关资源
    最近更新 更多