📅  最后修改于: 2023-12-03 14:59:36.921000             🧑  作者: Mango
在C++中,虚函数是一种在基类中定义的方法,该方法可以在派生类中重写,在运行时根据对象类型的实际类型调用。虚函数是使用多态实现的关键。
在这个问题中,考虑一个基类Animal,包含一个虚函数speak(),表示动物发出声音的方式。我们需要编写两个派生类,分别是Dog和Cat,并且实现各自的speak()方法。
class Animal {
public:
virtual void speak() {
std::cout << "The animal makes a sound" << std::endl;
}
};
在该类中,speak()方法被声明为虚函数。这意味着在派生类中,我们可以对其进行改写,该方法将在派生类中覆盖原始实现。
class Dog : public Animal {
public:
void speak() override {
std::cout << "The dog says woof!" << std::endl;
}
};
在该类中,我们在speak()前使用关键字override,这样编译器可以检查是否正确重写了虚函数。通过这种方式,我们在派生类中覆盖了Animal类中的speak()方法。
class Cat : public Animal {
public:
void speak() override {
std::cout << "The cat says meow!" << std::endl;
}
};
在该类中,我们同样使用了override,这样编译器可以检查是否正确重写了虚函数。通过这种方式,我们在派生类中覆盖了Animal类中的speak()方法。
int main() {
Animal *animal;
Dog dog;
Cat cat;
animal = &dog;
animal->speak(); // 输出 "The dog says woof!"
animal = &cat;
animal->speak(); // 输出 "The cat says meow!"
return 0;
}
在该代码中,我们先将一个Animal类型的指针指向Dog对象,然后调用speak()方法。由于speak()方法已在Dog类中重写,因此输出的结果将是“狗吠声”。
接下来,我们将Animal类型的指针指向Cat对象,并调用speak()方法。由于speak()方法已在Cat类中重写,因此输出的结果将是“猫咪喵喵声”。
因此,虚函数使得我们可以通过派生类的对象访问被定义在基类中的方法。这种方式提供了众多优点,其中一个最重要的是增加了程序的可扩展性。