是否有(实用)的方式来绕过正常(虚拟)构造函数调用顺序?
例:
class A { const int i; public: A() : i(0) { cout << "calling A()" << endl; } A(int p) : i(p) { cout << "calling A(int)" << endl; } }; class B : public virtual A { public: B(int i) : A(i) { cout << "calling B(int)" << endl; } }; class C : public B { public: C(int i) : A(i),B(i) { cout << "calling C(int)" << endl; } }; class D : public C { public: D(int i) : /*A(i),*/ C(i) { cout << "calling D(int)" << endl; } }; int main() { D d(42); return 0; }
输出:
calling A()
calling B(int)
calling C(int)
calling D(int)
我想要的是:
calling A(int)
calling B(int)
calling C(int)
calling D(int)
如你所见,有虚拟继承涉及,它导致D的构造函数首先调用A的构造函数,但是由于没有提供参数,所以它调用A().有一个const int我需要初始化,所以我有一个问题.
我想做的是隐藏C的继承细节,这就是为什么我正在寻找一种方法来避免在D(和每个派生)构造函数的初始化列表中调用A(i).在这种具体情况下,我可以假设只有C的非虚拟单继承子类(D为1). [/编辑]
[编辑]
Virtual base classes are initialized before any non-virtual base classes are initialized,so only the most derived class can initialize virtual base classes. – James McNellis
这就是要点,我不希望最传统的类调用虚拟基类构造函数.
[/编辑]
考虑以下情况(在上面的代码示例中未表示):
A / \ B0 B1 \ / C | D