C++ 多态机制浅析

简介: 编译时多态--函数重载 编译后生成的中间代码(如GCC生成的.o文件,此时还不是汇编语言)函数名字有变化,看下面两个例子。 void cc_show(const char*str)     ->    _Z7cc_showPKc void cc_show(int x)            ->     _Z7cc_showi 大家可以看到,函数名其实不同,与返回值、函

编译时多态--函数重载

编译后生成的中间代码(如GCC生成的.o文件,此时还不是汇编语言)函数名字有变化,看下面两个例子。

void cc_show(const char*str)     ->    _Z7cc_showPKc

void cc_show(int x)            ->     _Z7cc_showi

大家可以看到,函数名其实不同,与返回值、函数名、参数有关。函数重载的规则就是参数的个数或种类必须不同,所以就不会有混乱了。

 

运行时多态--virtual动态绑定

编译器在编译的时候,会为含有虚函数的类/含有虚函数的类/为基类/的子类创建一个虚函数表(即virtual table),该表是一个一维数组,存放每个虚函数的地址。

那么如何定位虚表呢?编译器另外还为每个类的对象提供了一个虚表指针(即vptr),这个指针指向了对象所属类的虚表。在程序运行时,根据对象的类型去初始化vptr,从而让vptr正确的指向所属类的虚表,因此在调用虚函数时,就能够找到正确的函数。

虚函数表是一个类一个,而非一个对象一个。对象只需要维护一个指向它所在类的虚函数表的指针即可。若一个类是多继承,且其他父类也有虚函数,则这个类需要维护多个虚函数表。

目录
相关文章
|
21天前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
22 0
|
23天前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
31 0
|
30天前
|
安全 JavaScript 前端开发
C/C++面试题:如何理解多态?
C/C++面试题:如何理解多态?
23 0
|
25天前
|
安全 算法 C++
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(三)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
47 0
|
27天前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
25 0
|
21天前
|
编译器 C++
C++之多态
C++之多态
|
23天前
|
存储 编译器 C++
从Proto到C++:探索Protocol Buffers的强大转换机制
从Proto到C++:探索Protocol Buffers的强大转换机制
240 4
|
23天前
|
存储 程序员 编译器
【C++ 模板类与虚函数】解析C++中的多态与泛型
【C++ 模板类与虚函数】解析C++中的多态与泛型
46 0
|
24天前
|
设计模式 存储 安全
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
102 0
|
25天前
|
传感器 安全 编译器
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
60 0