C++多态的实现原理

静态多态(编译期)

函数重载

  • 允许在同一个作用域中声明多个功能类似的同名函数
  • 函数的参数列表不同(参数个数,参数类型,参数顺序)
  • 注意:不能通过函数返回值区分(name mangling不包括返回值)

原理

  • 预编译:头文件的函数声明拷贝到源文件,避免编译过程找不到函数定义
  • 编译:语法分析,同时进行符号汇总(函数名)
  • 汇编:生成函数名到函数地址的映射,方便之后通过函数名找到函数定义的位置
  • 链接:将多个文件的符号表汇总合并

*objdump -t o

  • _ZN + 类长度+ 类名+ 函数名长度 + 函数名 + E + 类型首字母

模版

  • 编译期间进行实例化
  • 性能要高,避免了运行时的开销

动态多态

虚函数重写,运行时确定

  • 在基类的函数前面加上virtual关键字,派生类重写函数
  • 运行时根据对象的类型调用相应的函数
  • 如果对象的类型是基类,则调用基类的函数
  • 如果对象的类型是派生类,调用派生类的函数

原理

  • 早绑定:编译时已经确定函数调用的地址
  • 晚绑定:需要用到虚函数表,运行时才能确定

早绑定(Early Binding)

早绑定,也称为静态绑定(Static Binding),是在编译时确定函数调用的具体实现。这意味着在编译阶段,编译器已经知道函数调用对应的具体函数。早绑定通常与非虚函数、函数重载和模板有关。

早绑定的优点:

  1. 性能高,因为函数调用在编译时已确定,不需要运行时查找。
  2. 类型安全,因为编译器在编译时进行类型检查,可以捕捉到类型不匹配的错误。

示例:

#include <iostream>
using namespace std;

class Base {
public:
    void display() {
        cout << "Base display" << endl;
    }
};

class Derived : public Base {
public:
    void display() {
        cout << "Derived display" << endl;
    }
};

int main() {
    Base b;
    Derived d;
    
    Base *ptr = &d;
    ptr->display(); // 调用 Base::display()
    
    return 0;
}

在上述示例中,ptr->display() 是早绑定,因为编译器在编译时已经知道 ptrBase 类型的指针,并且调用 Base 类的 display 函数。

晚绑定(Late Binding)

晚绑定,也称为动态绑定(Dynamic Binding),是在运行时确定函数调用的具体实现。这通常通过虚函数(virtual functions)和多态性实现。晚绑定依赖于虚函数表(vtable),通过指针在运行时查找函数的具体实现。

晚绑定的优点:

  1. 灵活性高,允许程序在运行时决定调用哪个函数。
  2. 支持多态性,使得可以通过基类指针调用派生类的实现。

示例:

#include <iostream>
using namespace std;

class Base {
public:
    virtual void display() {
        cout << "Base display" << endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        cout << "Derived display" << endl;
    }
};

int main() {
    Base *ptr = new Derived();
    ptr->display(); // 调用 Derived::display()
    
    delete ptr;
    return 0;
}

在上述示例中,ptr->display() 是晚绑定,因为 display 是虚函数,具体调用的函数是在运行时根据对象的实际类型(即 Derived)决定的。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

相关推荐

  1. C++实现原理

    2024-07-12 20:32:03       22 阅读
  2. C++详解:静态与动态实现

    2024-07-12 20:32:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 20:32:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 20:32:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 20:32:03       57 阅读
  4. Python语言-面向对象

    2024-07-12 20:32:03       68 阅读

热门阅读

  1. 高级前端工程师面试题

    2024-07-12 20:32:03       23 阅读
  2. 实现原理:远程过程调用(RPC)

    2024-07-12 20:32:03       24 阅读
  3. Python通过继承实现多线程

    2024-07-12 20:32:03       19 阅读
  4. 2024年C#优秀实用的类库推荐

    2024-07-12 20:32:03       25 阅读
  5. L1 Simple_ReAct_Agent

    2024-07-12 20:32:03       19 阅读
  6. rust way step 7

    2024-07-12 20:32:03       19 阅读
  7. sqlalchemy通过查询参数生成query

    2024-07-12 20:32:03       17 阅读