2017-07-06 91 views
0

我已經看到這種問題的多個答案,但我不知道如何解決它。主要的問題可能是我正在處理別人的代碼,但是呃。下面是針對此問題減少樣品: 我有一類鏈接許多其他類:無法將變量聲明爲抽象類型,因爲虛擬函數是純粹的 - 具有多重繼承

class Interface 
    : public system_atoms, 
    public system_io, 
    /* etc, others */ 
{ 
/* A few functions, none that matters here - none from the inherited classes redefined */ 
} 

裏面system_atoms,我有:

class system_atoms { 
public: 
    virtual int init_atom(int atom_number) = 0; 
    virtual int check_atom_id(int atom_number) = 0; 
} 

而且我應該從接口繼承一個類:

class Interface_proxy : public Interface { 
public: 
/* stuff - no function from the inherited classes redefined */ 
} 

在的.cpp:

Interface_proxy global_interface_proxy; 

編譯帶來錯誤,指出「無法將變量global_interface_proxy聲明爲抽象類型Interface_proxy,因爲虛擬函數[system_atoms中列出的兩個]是純粹的」。

我不是很精通C++。我想我應該重新定義這兩個虛函數是純粹的(在沒有= 0virtual的情況下是相同的?),以便該變量不是抽象類型。但是我的知識停留在那裏 - 而多重繼承讓我感到困惑。

+1

如果該類具有純虛擬方法,則不能創建該類的實例。它被稱爲抽象類。所有派生類都必須實現這些方法,否則它們也將是抽象的。 –

+0

即使沒有多重繼承,你也會得到同樣的錯誤。如果你想聲明一個'Interface_proxy',它將需要一個指針或引用,然後你將不得不指向或者去實際的非抽象的(例如Interface_proxy),它實現了純粹的fns。 – doctorlove

回答

4

A pure virtual function是一個虛擬的功能,明確沒有實現(用尾部= 0表示)。純虛擬函數旨在強制派生類爲該函數提供自己的實現。換句話說,派生類有望最終爲該函數定義自己的行爲。

抽象類是一個具有一個或多個純虛函數的類,或者是因爲它聲明瞭至少一個,或者它從一個抽象類繼承而來,並且不覆蓋所有繼承的純虛函數。這些類不能被實例化(你不能創建它的一個實例),因爲它們的行爲沒有完全定義。它們只能用作其他類型的基類。

在你的情況下,system_atoms定義了2個純虛函數,所以它是一個抽象類。您列出的從system_atoms繼承的每個類都是抽象的,因爲它們都從這些純虛函數繼承,並且從不覆蓋它們。

正確的解決方案是通過覆蓋爲派生類中的那些純虛函數提供實現。

virtual functionsoverride符。

多繼承不在這裏發揮作用,除了每個繼承類可能有它自己的純虛函數。只需重寫純虛函數即可。

+0

謝謝。如果我正確地理解了這個,我需要在Interface_proxy中重寫這兩個函數,像'int init_atom(int atom_number)override;'。 – Marlon

+0

@Marlon是的,還有'check_atom_id'。然後你必須執行它們。您可能需要反思您的案例適用於這些方法的適當行爲。 –

+0

有史以來最好的答案 – rimiro

相關問題