📜  C ++ |继承|问题3(1)

📅  最后修改于: 2023-12-03 15:13:45.270000             🧑  作者: Mango

C++ | 继承 | 问题3

在C++中,继承是面向对象编程的基础之一。它允许程序员创建一个新的类,从现有的类中继承属性和方法,并添加自己的特殊属性和方法。问题3涉及到一个关于多态和虚函数的继承问题。

问题描述

已知父类Animal具有一个无参虚函数void speak(),子类DogCat继承自Animal类,它们都重写了speak()方法。

现在,有一个vector,里面存储着Animal指针类型的对象,其中有DogCat对象。请问,如何遍历这个vector并调用每个对象的speak()方法?

解决方法

由于给定的vector中存储的是Animal指针类型的对象,因此可以使用多态来调用speak()方法。具体步骤如下:

  1. 遍历vector,获取每个对象的指针。

  2. 使用dynamic_cast将指针转换为DogCat类型的指针。

  3. 调用speak()方法。

#include <iostream>
#include <vector>
using namespace std;

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

class Dog : public Animal {
public:
    void speak() {
        cout << "Dog barks" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() {
        cout << "Cat meows" << endl;
    }
};

int main() {
    vector<Animal*> animals;
    animals.push_back(new Dog);
    animals.push_back(new Cat);
    animals.push_back(new Dog);
    animals.push_back(new Cat);

    for (Animal* animal : animals) {
        if (Dog* dog = dynamic_cast<Dog*>(animal)) {
            dog->speak();
        } else if (Cat* cat = dynamic_cast<Cat*>(animal)) {
            cat->speak();
        }
    }

    for (Animal* animal : animals) {
        delete animal;
    }

    return 0;
}

以上代码中,我们首先定义了父类Animal,其拥有子类DogCat所需要的speak()方法。然后,我们在main函数中创建了一个vector,将类型为DogCat的对象指针存入其中。

接着,我们使用一个for循环遍历vector,每次从中取出一个Animal类型的指针,并使用dynamic_cast将其转换为DogCat类型的指针。最后,我们调用speak()方法,实现不同的输出结果。

需要注意的是,在遍历完成后,我们需要delete每个存储在vector中的对象,以释放内存空间。