码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 多态的实现原理

时间:2015-06-24 22:31:41      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

C++ 多态的实现原理

标签:

原文地址:http://www.cnblogs.com/aqing1987/p/4598756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!