C++ 如何在虚拟继承的下游使用参数化基类构造函数
我的类结构如下所示:C++ 如何在虚拟继承的下游使用参数化基类构造函数,c++,inheritance,constructor,virtual-inheritance,C++,Inheritance,Constructor,Virtual Inheritance,我的类结构如下所示: O | A / \ B C \ / D | E 构造函数的工作方式如下(为了简洁起见,未包含特定代码,但如果需要,我可以进一步充实): 类O、A、B、C和D应该是库的一部分,而类D是我以后创建的任何类(如E)的基类。D的唯一目的是简化像E这样的类的继承。我的问题是E的构造函数调用A的默认构造函数,除非我显式调用A的参数化构造函数,这违背了D的目的 这种继承结构最适合我的应用程序,因为类C&D用于专门化A&B创建的基础结构。C包含A的其他方法
O
|
A
/ \
B C
\ /
D
|
E
构造函数的工作方式如下(为了简洁起见,未包含特定代码,但如果需要,我可以进一步充实):
类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是默认可构造的,并让编译器帮助您,或者重构你的代码,一开始就不使用菱形继承。A需要默认构造函数吗?那种类结构从来都不是一件好事。@aschepler-A不需要默认构造函数,除了允许在不显式调用A的字符串构造函数的情况下构造E。@erip-我同意这不理想,但是考虑到包含这一部分的更广泛的类结构,这是没有创建重复类的最简单的布局。这不是我真正想要的答案,而是我所期望的。谢谢
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) { };
}