背景
C++实现多态主要有两种方式:编译时多态(静态多态)和运行时多态(动态多态)
1、编译时多态(静态多态)
- 函数重载和运算符重载
void print(int x) {
std::cout << "int: " << x << std::endl;
}
void print(double x) {
std::cout << "double: " << x << std::endl;
}
- 模板
template <typename T>
T add(T a, T b) {
return a + b;
}
2、运行时多态(动态多态)
运行时多态是通过继承和虚函数实现的
- 实现方式:使用基类指针或引用调用排成类重写的虚函数
- 编译器通过虚函数表来支持运行时绑定
class Base {
public:
virtual void speak() {
std::cout << "Base speaking" << std::endl;
}
virtual ~Base() {} // 必须有虚析构函数
};
class Derived : public Base {
public:
void speak() override {
std::cout << "Derived speaking" << std::endl;
}
};
int main() {
Base* obj = new Derived();
obj->speak(); // 输出:Derived speaking(动态绑定)
delete obj;
}
- 虚函数表的原理简述
- 每个含有虚函数的类,编译器都会生成一个虚函数表
- 每个对象包含一个指向该表的指针
- 调用虚函数时,程序运行时通过vptr查找vtable中函数地址,从而实现动态绑定