2015-11-06 6 views
0

Почему вместо этого вызывается метод Mammal 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

не должно быть, «Mammal * mammal = new Cat();' –

+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++. Вам необходимо динамически создать объект вместе с ключевым словом virtual.

Таким образом, правильный способ создать объект должен быть

int main 
{ 
    Mammal *mammal = new Cat("CatName", Blue, 9); 
    mammal->speak(); 
} 
Смежные вопросы