📜  C ++ |虚函数|问题7(1)

📅  最后修改于: 2023-12-03 14:59:36.921000             🧑  作者: Mango

C++ | 虚函数 | 问题7

在C++中,虚函数是一种在基类中定义的方法,该方法可以在派生类中重写,在运行时根据对象类型的实际类型调用。虚函数是使用多态实现的关键。

在这个问题中,考虑一个基类Animal,包含一个虚函数speak(),表示动物发出声音的方式。我们需要编写两个派生类,分别是Dog和Cat,并且实现各自的speak()方法。

Animal类
class Animal {
public:
    virtual void speak() {
        std::cout << "The animal makes a sound" << std::endl;
    }
};

在该类中,speak()方法被声明为虚函数。这意味着在派生类中,我们可以对其进行改写,该方法将在派生类中覆盖原始实现。

Dog类
class Dog : public Animal {
public:
    void speak() override {
        std::cout << "The dog says woof!" << std::endl;
    }
};

在该类中,我们在speak()前使用关键字override,这样编译器可以检查是否正确重写了虚函数。通过这种方式,我们在派生类中覆盖了Animal类中的speak()方法。

Cat类
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类中重写,因此输出的结果将是“猫咪喵喵声”。

因此,虚函数使得我们可以通过派生类的对象访问被定义在基类中的方法。这种方式提供了众多优点,其中一个最重要的是增加了程序的可扩展性。