多态
多态:同一接口表现出不同的行为。
两种多态
编译时多态(静态多态)
通过 函数重载 和 模板 实现,在编译时确定调用哪个函数。
cpp
// 函数重载
void print(int x) { cout << x << endl; }
void print(double x) { cout << x << endl; }
void print(const string& s) { cout << s << endl; }
print(42); // 调用 print(int)
print(3.14); // 调用 print(double)
print("hello"); // 调用 print(string)
// 模板
template<typename T>
void print(const T& x) { cout << x << endl; }
print(42); // T = int
print(3.14); // T = double运行时多态(动态多态)
通过 虚函数 和 继承 实现,在运行时根据实际对象类型决定调用哪个函数。
cpp
class Animal {
public:
virtual void speak() const {
cout << "动物在说话!" << endl;
}
virtual ~Animal() = default;
};
class Dog : public Animal {
public:
void speak() const override {
cout << "狗在说话!" << endl;
}
};
class Cat : public Animal {
public:
void speak() const override {
cout << "猫在说话!" << endl;
}
};
int main() {
Animal* a1 = new Dog();
Animal* a2 = new Cat();
a1->speak(); // 输出:狗在说话!
a2->speak(); // 输出:猫在说话!
delete a1;
delete a2;
}
运行时多态的关键要素:
- 基类声明虚函数:使用
virtual关键字 - 派生类重写函数:用相同签名覆盖基类实现
- 通过基类指针/引用调用:运行时决定具体调用哪个版本