我有一個經典的虛擬繼承鑽石:參數化的構造幾乎繼承抽象類
class A {
protected:
A(const char *x) { ... }
}
class B: public virtual A {
protected:
B(): A(NULL) { ... }
public:
virtual void foo() = 0;
}
class C: public virtual A {
protected:
C(): A(NULL) { ... }
public:
virtual void bar() = 0;
}
class D: public B, public C {
public:
D(const char *x): A(x) { ... }
void foo();
void bar();
}
我B
使用NULL和C
因爲他們是抽象類的構造函數A
將永遠不會在他們的constructurs叫。有沒有更好的方法來實現它,除了在構造函數中指定NULL
或在A
中聲明無參數構造函數?我想用參數調用構造函數,因此應該只允許在抽象類中使用該構造函數。
我還可以定義一些AbstractPlaceholder,並曾以此爲'A(常量AbstractPlaceholder&AP){斷言(假); }' - 這可能是最好的,但也許有人知道更好的解決方案,它可以讓A不知道它會被虛擬繼承。 –
「,因爲它們是抽象類,所以A ctor將永遠不會在構造器中被調用。」怎麼樣? –
非常有趣。我猜想編譯器沒有理由知道'B'是否可以實例化,所以B的構造函數*有*可以爲它的'A'子對象調用一個構造函數,即使這個子對象是虛擬的,真實的構造函數調用可能會被替換。在道義上,我們想要的是'A'有一個純虛構造器,'虛擬A()= 0;',可以被虛擬的抽象派生類使用。 –