c++ - 打破虚拟继承避免显式基 ctor
问题描述
以下解释和示例从这里我已经示例性地构建了以下继承模型,创建了一个菱形
class Base {
public:
int data_;
Base(int d) : data_(d) {}
Base() = deleted;
};
class A : public virtual Base {
public:
A() : Base(42) {};
};
class B : public virtual Base {
public:
B() : Base(24) {};
}
class AB : public A, public B {
public:
AB() : Base(-1) {};
}
到目前为止,一切都很好; 注意,现在AB()
需要调用Base(int)
-ctor。这是可以理解的,因为通过 AB>>A>>Base 或 AB>>B>>Base 的替代初始化分支不会导致明确定义的行为。
A
在我们关闭菱形之前,让我们从类分支到一个侧分支:
class A_Child : public A {
public:
A_Child() : A() {}; // not permitted by compiler
}
这不会编译,因为编译器会明确要求Base(int)
在A_Child
.
我不太了解这种行为;因为此时我们不再虚拟继承,并且 A_Child>>A>>Base 的初始化路径并不模糊。
现在看来,对于每一个进一步的派生类,A_Child
我都必须再次明确指定Base(int)
初始化程序。这是一种打破封装的方式,因为从此类派生的每个代码都需要知道基类的行为和实现方式。
一旦我分支到边线,有什么方法可以停止或中断虚拟继承?
解决方案
推荐阅读
- python - 在表单中添加的字段上添加到 manytomany 字段
- java - findElement 和 findElements 抽象方法可以直接在 WebDriver 接口中声明吗?
- python - 使用python的PDF解码器
- c# - UI 按钮在 Unity ARFoundation 中不起作用
- php - @include('partials.register') 有什么作用?
- c# - 来自同步方法的异步 lambda
- javascript - 使用 RXJS,如何从第一次按下到时间窗口结束时观察到按键?
- python - 在 Python 中访问字符串的二进制文件
- ffmpeg - 使用 ffmpeg 和 xfade 过滤器组合三个或更多视频
- python - 为什么我的 PCA 双图中的“加载”偏移?(Python,Matplotlib)