首页 > 解决方案 > 打破虚拟继承避免显式基 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)初始化程序。这是一种打破封装的方式,因为从此类派生的每个代码都需要知道基类的行为和实现方式。

一旦我分支到边线,有什么方法可以停止或中断虚拟继承?

标签: c++classinheritancevirtual

解决方案


推荐阅读