2011-03-19 59 views
0

我有一個虛擬內聯getter和setter的A類。從A有兩個類B和C派生。我有一個D類,來自B和C. Creatown D中的一個對象,並使用getName()結果「未定義的引用getName()」。刪除「聯機」do not't工作。頭文件包含正確。 這裏有什麼問題?未定義的引用,但它被定義爲

class A 
{ 
    public: 
     virtual inline std::string getName() const{return name;} 

    protected: 
     std::string name; 
}; 

class B : public virtual A {}; 
class C : public virtual A {}; 

class D : public B, public C {}; 
+0

你真的想虛擬繼承? – 2011-03-19 09:01:11

+1

顯示問題的粘貼代碼。上面的代碼不顯示它。 – wilx 2011-03-19 09:02:56

+0

[gcc C++虛擬繼承問題]的可能重複(http://stackoverflow.com/questions/2126522/gcc-c-virtual-inheritance-problem) – 2011-03-19 09:07:32

回答

2

您的代碼編譯好有/無inlinewith inlinewithout inline

但除此之外,記住這一點:在一個虛擬繼承,你已經初始化基地明確如果基類構造函數接受參數爲,

class D : public B, public C 
{ 
    public: 
     D(string s) : A(s), B(s), C(s){} 
        //^^^^ note this! 

}; 

只是​​是不夠的:http://ideone.com/MPUPj

A(s)需要:http://ideone.com/DNLkA

更多細節請參見本主題:about virtual base class and virtual inheritance in C++

+0

不,您不必顯式初始化虛擬基礎是默認構造的,在這種情況下它是。沒有? – 2011-03-19 09:15:36

+0

編譯器是否會生成一個工作的默認構造函數,因爲在問題的代碼中沒有定義構造函數? – rve 2011-03-19 09:18:45

+0

@阿門:你說得對。我錯過了這一點。更新了我的答案! – Nawaz 2011-03-19 09:20:45

相關問題