📅  最后修改于: 2023-12-03 15:13:45.270000             🧑  作者: Mango
在C++中,继承是面向对象编程的基础之一。它允许程序员创建一个新的类,从现有的类中继承属性和方法,并添加自己的特殊属性和方法。问题3涉及到一个关于多态和虚函数的继承问题。
已知父类Animal
具有一个无参虚函数void speak()
,子类Dog
和Cat
继承自Animal
类,它们都重写了speak()
方法。
现在,有一个vector
,里面存储着Animal
指针类型的对象,其中有Dog
和Cat
对象。请问,如何遍历这个vector
并调用每个对象的speak()
方法?
由于给定的vector
中存储的是Animal
指针类型的对象,因此可以使用多态来调用speak()
方法。具体步骤如下:
遍历vector
,获取每个对象的指针。
使用dynamic_cast
将指针转换为Dog
和Cat
类型的指针。
调用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
,其拥有子类Dog
和Cat
所需要的speak()
方法。然后,我们在main
函数中创建了一个vector
,将类型为Dog
和Cat
的对象指针存入其中。
接着,我们使用一个for
循环遍历vector
,每次从中取出一个Animal
类型的指针,并使用dynamic_cast
将其转换为Dog
或Cat
类型的指针。最后,我们调用speak()
方法,实现不同的输出结果。
需要注意的是,在遍历完成后,我们需要delete
每个存储在vector
中的对象,以释放内存空间。