为什么C++需要虚函数?请举例说明
你好!我刚开始学习C++,正在尝试理解虚函数。我读了很多文章,但还是不完全明白它们为什么是必需的。
我有一个基类 `Animal` 和派生类 `Dog` 和 `Cat`。我希望每个动物都有自己的声音。没有虚函数时,我这样写:
```cpp
class Animal {
public:
void speak() { cout << "Some animal sound\n"; }
};
class Dog : public Animal {
public:
void speak() { cout << "Woof!\n"; }
};
class Cat : public Animal {
public:
void speak() { cout << "Meow!\n"; }
};
```
当我直接创建对象时,一切正常:
```cpp
Dog dog;
Cat cat;
dog.speak(); // Woof!
cat.speak(); // Meow!
```
但如果我使用指向基类的指针,则会调用基类的方法,而不是派生类的方法:
```cpp
Animal* ptr1 = new Dog();
Animal* ptr2 = new Cat();
ptr1->speak(); // 输出 "Some animal sound",但应该输出 "Woof!"
ptr2->speak(); // 输出 "Some animal sound",但应该输出 "Meow!"
```