在C++中,实现多态通常通过继承和虚函数来实现。以下是几种常用的方法:
- 继承和虚函数
- 抽象类
1. 继承和虚函数
通过基类中的虚函数,子类可以重写这些函数,从而实现多态。
#include <iostream>
#include <vector>
using namespace std;
class Animal {
public:
virtual void speak() const {
cout << "Animal speaks" << endl;
}
virtual ~Animal() = default;
};
class Dog : public Animal {
public:
void speak() const override {
cout << "Woof!" << endl;
}
};
class Cat : public Animal {
public:
void speak() const override {
cout << "Meow!" << endl;
}
};
int main() {
vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
for (const auto& animal : animals) {
animal->speak();
}
// 清理内存
for (auto& animal : animals) {
delete animal;
}
animals.clear();
return 0;
}
在这个例子中,Animal
类有一个虚函数speak
,Dog
和Cat
类继承了Animal
并重写了speak
函数。通过基类指针调用speak
时,会根据实际对象的类型调用相应的重写方法。
2. 抽象类
抽象类是包含至少一个纯虚函数的类,不能被实例化,必须由派生类实现。
#include <iostream>
#include <vector>
using namespace std;
class Animal {
public:
virtual void speak() const = 0; // 纯虚函数
virtual ~Animal() = default;
};
class Dog : public Animal {
public:
void speak() const override {
cout << "Woof!" << endl;
}
};
class Cat : public Animal {
public:
void speak() const override {
cout << "Meow!" << endl;
}
};
int main() {
vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
for (const auto& animal : animals) {
animal->speak();
}
// 清理内存
for (auto& animal : animals) {
delete animal;
}
animals.clear();
return 0;
}
在这个例子中,Animal
类是一个抽象类,因为它包含一个纯虚函数speak
。Dog
和Cat
类必须实现speak
函数。这样,通过基类指针调用speak
时,会根据实际对象的类型调用相应的实现。
通过这些方式,可以在C++中实现多态,从而使代码能够以同样的方式处理不同类型的对象。