2015-11-06 91 views
0

爲什麼哺乳動物speak方法被調用?虛擬方法未被覆蓋?

int main() { 
    Mammal mammal = Cat("CatName", Blue, 9); 
    mammal.speak(); 
} 

class Mammal : public Animal{ 
public: 
    virtual void speak() const { 
     cout << "Mammal speaks" << endl; 
    } 
}; 

class Cat : public Mammal { 
public: 
    void speak() const { 
     cout << "Cat meow!" << endl; 
    } 
}; 
+1

不應該是''哺乳動物*哺乳動物=新貓();' –

+0

禁用多態類的拷貝構造函數和賦值操作符可以幫助防止這些錯誤。 –

回答

2

多態性只與指針或引用的作品:您聲明mammal實際Mammal類的一個實例。

將其改爲指針或引用會改變語義,因爲指針或引用指的是Mammal

Mammal const & mammal = Cat(); 
// or 
Mammal * mammal = new Cat(); 
// don't forget the delete, better: 
std::unique_ptr<Mammal> mammal = std::make_unique<Cat>(); 

在這種情況下,您可能也很快會知道object slicing

1

這就是大多數Java和C#程序員面對C++的情況。您需要動態創建一個對象以及一個虛擬關鍵字。

所以,要創建一個對象的正確方法應該是

int main 
{ 
    Mammal *mammal = new Cat("CatName", Blue, 9); 
    mammal->speak(); 
}