C++ 多态性分析

时间:2021-11-02 08:28:40

编译 - 时间多态性--函数重载

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

void cc_show(const char*str)     ->    _Z7cc_showPKc

void cc_show(int x)            ->     _Z7cc_showi

大家能够看到,函数名事实上不同,与返回值、函数名、參数有关。

函数重载的规则就是參数的个数或种类必须不同,所以就不会有混乱了。

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

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

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

虚函数表是一个类,代替一个对象的。对象只需要保持一个指向虚拟函数表它在类中的指针可以是。如果一个类是多重继承,和其他家长也有虚函数。那么这个类需要维护多个虚函数表。