为什么首先调用虚拟基类构造函数
Why virtual base class constructors called first?
可能的重复项:
在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
.
相关文章:
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在成员构造函数之后调用基类构造函数
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 如何在 C++ 中将参数传递给基类构造函数
- 将数据成员的指针传递给基类构造函数是否安全?
- 使用基类构造函数初始化儿童类
- 使用基类构造函数的子类构造函数的大纲定义
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否可以使用基类构造函数通过派生类将值初始化为基类私有成员?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 是否可以在运行时切换到不同的基类构造函数?
- 对基类构造函数的未定义引用
- 如何为基类构造函数中的每个子类执行特定任务
- 将类传递到基类构造函数的模板参数中?
- 如何在基类构造函数中使用派生类成员
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 使用相同的参数调用基类C++构造函数