2016-11-28 112 views
-6

有什麼問題?我認爲,這是正確面向對象問題C++

class A{ 
public: 
    virtual bool isGun() = 0; 
    virtual bool isArmor() = 0; 
}; 

class B: public A{ 
public: 
    virtual bool isGun(){ return true; } 
}; 

int main(){ 
    B* b = new B; 
} 

A :: isArmor() - 定義爲其他類

我真的需要定義所有子類的所有純虛函數?

+1

你的類定義中沒有'print'。 –

+2

是什麼讓你相信'A :: isGun()'在你的例子中被調用,而不是'B :: isGun()'?如果沒有定義它,那麼如何調用'A :: isGun()'even *? –

+1

爲什麼你認爲'A :: isGun()'被調用?這將是一個絕招,能夠調用一個純粹的,不存在的函數。 –

回答

0

你必須重寫你的子類中的純虛函數,否則你的子類將變成抽象類,因此我們不能創建抽象類的對象。

如果您不希望子類中的isArmor函數公開,請將其覆蓋爲private,以便B的客戶端無法使用它。

class B : public A{ 
private: 
    virtual bool isArmor() { return true; } // Like this 
public: 
    virtual bool isGun(){ return true; } 
}; 
1

有什麼不好?

您還沒有定義在BisArmor因此你不能創建B任何實例。

我真的需要在所有子類中定義所有純虛函數嗎?

是的。這就是純虛函數意味着。如果你不想在所有的子類中定義一個函數,那麼不要把它變成純虛擬的。