微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在多级继承中表达虚拟祖先

如何解决在多级继承中表达虚拟祖先

对于虚拟继承,最派生对象的义务不仅是初始化直接基类,还初始化所有 virtual 祖先类。

例如,考虑以下类层次结构(注意 struct 认使用 public 继承):

struct B {
    B() = delete;
    B(int);
};
struct D1 : virtual B {
    D1(int x) : B(x) {}
};
struct D2 : virtual B {
    D2(int x) : B(x) {}
};

如果我要引入这样的 D12 类...

struct D12 : D1,D2 {
    D12(int x) : D1(x),D2(x) {}
};

编译会失败,因为 D12 必须初始化 B 并且因为它没有这样做,编译器假定应该调用认构造函数(已删除)。解决方案是手动调用 B::B(int) 构造函数

struct D12 : D1,D2 {
    D12(int x) : B(x),D1(x),D2(x) {}
};

我发现该解决方案存在问题。问题是类 D1 的声明不包含 Bvirtual。为了正确实现这个类,我们必须以某种方式知道类 D1D2 继承自虚拟基类 B。可以说应该假设如果我们使用多重继承,那么我们将不得不初始化一些虚拟基类。然而,当似乎只使用常规继承时,问题仍然存在:

struct D : D1 {
    // D still has to initialize B
    D(int x) : B(x),D1(x) {}
};

作为一种解决方法,我想也许我可以让 D 也继承自 B(实际上)以至少在声明中表达这种隐藏的依赖:

struct D : virtual B,D1 {
    D(int x) : B(x),D1(x) {}
};

这是否保证等同于之前的代码?这个问题有没有更好的解决方案?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。