2013-07-24 167 views
1

我有一個簡單的抽象類(比如說A)和繼承它的類(比如C)。「無法實例化抽象類」錯誤

class C : A 

問題是第二個(C)包含我需要在另一個類中的代碼;我認爲將這部分代碼拆分爲單獨的類(B)並將其從我需要的類派生出來是很好的。

B(的代碼共享部分)>> C(目標)< < A(對於C抽象基)

它是所有行 - 除了在基類(A)聲明爲抽象的功能之一 定義於B,而非C。這導致我的錯誤,我想。 ,我在尋找解決方案...

class A // a base class i need to derive from 
{ 
    // ... 
public: virtual bool Get() const; 
    // ... 
}; 

class B // only contains definition for get() 
{ 
public: 
    bool Get() const { return false; } 
}; 

class C : public B, public A // firstly derive from B, than from A.. ?? 
{ 
    // so Get(), required by A is defined in B, which C derives from ... 
    // and i cant derive from A because of that... I can't do that anyway? 
}; 

我希望我描述正確的..

+0

但是'A'類不是抽象的嗎? –

+0

A是抽象的,C是我需要從A中推導出來的。但A抽象標記的一些定義是在B中,而不是C. – Loryan55

+0

這不是重複的問題。大聲笑 – Loryan55

回答

2

如果A是抽象類,或者如果你想從調用接口獲取(),你需要重載虛函數:

class C : public B, public A 
{ 
public: 
    virtual bool Get() const { 
     return B::Get(); 
    } 
}; 
+0

噢!這更好!謝謝 – Loryan55

5

您可以選擇與using語句中使用其Get方法:

class C : public B, public A 
{ 
public: 
    using B::Get; 
}; 

這告訴編譯器使用B類中的Get函數。

但是,如果A包含純虛擬方法,則不起作用。

+2

-1。即使A包含不純粹的虛擬方法,試圖從A的C類throught接口實例中調用B將調用A :: Get,而不是B :: Get,因爲關鍵字「using」只是語法糖, t覆蓋接口A的虛擬功能表。例如:C c; A&rA =&c; rA.Get(); //將調用A :: Get(),而不是B :: Get()。這不是什麼問題。 – user1837009

2

如果你想這個工作正常B應該繼承AC應該從B繼承。

多重繼承導致歧義,如您所描述的那樣:A有一個抽象方法get()B具有相同的方法但實現。由於AB沒有關係,因此在C中繼承哪種方法可能取決於A中的get()仍未實現的事實。 (即B實現它事實上是無用的,因爲B沒有任何關係A