2013-11-01 67 views
0

我有以下類,我試圖訪問使用H類對象的基礎成員,並且我得到一個H :: a是不明確的警告。是不是一個非靜態數據成員或基類

class E { 
public: 
    E() : a(11) { } 
    int a; 
}; 

class F : public E { 
public: 
    F() : b(22) { } 
    int b; 
}; 

class G : public E { 
public: 
    G() : c(33) { } 
    int c; 
}; 

class H: public F, public G { 
public: 
    H() : d(44) { } 
    int d; 
}; 

我試圖使數據成員靜態的,但後來它不會讓我在基類的構造進行初始化。這兩個問題的解決方案是什麼?

+0

這是C++?如果是的話,你應該添加C++標籤。 – kfsone

+0

是的,這是謝謝你。我一直忘記這一點。 – GelatinFox

+2

它*不明確。你有兩個來自E的F推導的'a',一個來自E的G推導。或者通過全分辨率選擇一個,或者使用虛擬繼承。 – WhozCraig

回答

3

類「H」有兩個變量被稱爲「A」,一個從用於F,一個來自G.您可以使用一個限定詞,

H::a 

,或者您可以使用「虛擬」繼承符(見https://stackoverflow.com/a/419999/257645

#include <iostream> 

struct A { 
    int a; 
}; 

struct B : virtual public A { 
}; 

struct C : virtual public A { 
}; 

struct D : virtual public B, virtual public C { 
    void d1() { a = 1; } 
    void d2() { a = 2; } 
}; 

int main() { 
    D d; 
    d.d1(); 
    d.d2(); 
    std::cout << d.a << std::endl; 
} 

http://ideone.com/p3LPe0

+0

在OP的代碼中,它們不是函數;他們是成員變量。 – WhozCraig

+0

是的,我打算展示兩個並且懶惰 - 爲了與他的帖子保持一致,將它們改爲變量。 – kfsone

+0

+1前提是正確的。有關如何從集中基點的角度調用虛擬基類初始化的示例[請參閱此鏈接](http://ideone.com/RPMqYO),並特別注意A構造函數的看似*缺失*初始化方法調用從構建D時的B和C子類 – WhozCraig

相關問題