当前位置:  开发笔记 > 编程语言 > 正文

如何在虚拟继承下游使用参数化基类构造函数

如何解决《如何在虚拟继承下游使用参数化基类构造函数》经验,为你挑选了1个好方法。

我有一个类结构,如下所示:

  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需要运行特定的函数.



1> Puppy..:

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有