C++ 多态的实现原理
1)“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,
运行时才确定 -- 这叫 “动态联编”。
2)分析下面示例的运行结果
class Base { public: int i; virtual void Print() {cout << "Base::Print()" << endl;} }; class Derived: public Base { public: int n; virtual void Print() {cout << "Derived::Print()" << endl;} }; int main() { cout << sizeof (Base) << "," << sizeof (Derived) << endl; return 0; }
结果为:8,12
3)以上代码为何多了4个字节??
这涉及到了多态实现的关键-虚函数表,
每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。
虚函数表中列出了该类的虚函数地址。多出来的4个字节就是用来放虚函数表的地址的。
如下,Base 类中的 pointer for vTable 占4个字节。
派生类除继承了基类的 int i; 也有 4 个字节的 pointer for vtable
而对于
pBase = pDerived;
pBase->Print();
多态的函数调用语句被编译成一系列根据基类指针所指向的(若基类引用所引用的)对象中存放的
虚函数表的地址,在虚函数表中查找虚函数的地址,并最终调用虚函数的指令。