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();

多态的函数调用语句被编译成一系列根据基类指针所指向的(若基类引用所引用的)对象中存放的

虚函数表的地址,在虚函数表中查找虚函数的地址,并最终调用虚函数的指令。

posted @ 2015-06-24 22:04  阿青1987  阅读(213)  评论(0编辑  收藏  举报