一文读懂C++实现多态的方式

51 阅读1分钟

背景

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中函数地址,从而实现动态绑定