【问题标题】:How to use parameterized base class constructor downstream of virtual inheritance如何使用虚拟继承下游的参数化基类构造函数
【发布时间】:2023-04-10 21:33:02
【问题描述】:

我的类结构如下所示:

  O
  |
  A
 / \
B   C
 \ /
  D
  |
  E

构造函数的工作方式如下(为简洁起见,未包含具体代码,但如有必要,我可以进一步充实):

class O {
  protected:
    O(const string &str) {
      //Does stuff with str
    };
}

class A : public O {
  protected:
    A(const string &str) : O(str) { };
}

class B : public virtual A {
  protected:
    B(const string &str) : A(str) { };
}

class C : public virtual A {
  protected:
    C(const string &str) : A(str) { };
}

class D : public B, public C {
  protected:
    D(const string &str) : B(str), C(str) { };
}

class E : public D {
  public:
    E(const string &str) : D(str) { };
}

O、A、B、C 和 D 类应该是库的一部分,而 D 类是我以后创建的任何类(例如 E)的基类。 D 的唯一目的是简化 E 等类的继承。我的问题是 E 的构造函数调用 A 的默认构造函数,除非我显式调用 A 的参数化构造函数,这违背了 D 的目的。

这种继承结构最适合我的应用程序,因为 C 和 D 类用于专门化由 A 和 B 创建的基础结构。C 包含 A 的其他方法。

有没有办法让 D 处理对 A 的参数化构造函数的调用?理想情况下,我希望 E 的初始化以该顺序调用构造函数 A、B、C、D、E。字符串参数对于O上游的类来说非常重要,构造函数B和C需要运行特定的函数。

【问题讨论】:

  • A 需要默认构造函数吗?
  • 那种类结构从来都不是一件好事。
  • @aschepler - A 不需要默认构造函数,除非允许在不显式调用 A 的字符串构造函数的情况下构造 E。
  • @erip - 我同意这并不理想,但考虑到包含本节的更广泛的类结构,这是最简单的布局,无需创建重复的类。

标签: c++ inheritance constructor virtual-inheritance


【解决方案1】:

没有。虚拟基类必须始终由最派生的类构造。它不能以任何其他方式工作。您所能做的就是不允许 A 默认构造并让编译器帮助您,或者重构您的代码以首先不使用菱形继承。

【讨论】:

  • 不是我真正想要的答案,而是我所期待的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2015-06-21
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2020-08-05
相关资源
最近更新 更多