码迷,mamicode.com
首页 > 其他好文 > 详细

虚函数的底层实现机制、虚函数内存布局以及虚函数局限

时间:2018-07-07 20:34:50      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:网址   fonts   类对象   tps   编译器   运行时   stream   语句   顺序   

虚函数的内存布局以及局限,请参照下面网址的介绍,很详细很精彩

https://blog.csdn.net/lixungogogo/article/details/51138493

  C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。

#include<iostream>
using namespace std;
 
class Base
{
public:
virtual void fun1 () {cout<<" printf base fun1!" <<endl;}
virtual void fun2 () {cout<<" printf base fun2!" <<endl;}
private:
int m_data1;
} ;
 
class Derive: public Base
{
public:
void fun1 () {cout<<" printf derive fun1!" <<endl;}
void fun3 () {cout<<" printf derive fun3" <<endl;}
private:
int m_data2;
} ;
 
int main ()
{
Base *pBase=new Derive;
Derive a;
pBase->fun1 () ;
pBase->fun2 () ;
a.fun3 () ;
return 0;
}

在每一个含有虚函数的类对象中,增加了一个成员,就是都含有一个VPTR,指向虚函数表。

技术分享图片

派生类也会继承基类的虚函数,如果宅派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。

技术分享图片

当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。

2、多重继承的情况

#include<iostream>
class base1
{
public:
    virtual void vn() {}
privateint i;
);
class base2
{
publicvirtual void vf2(){}
privateint j;
);
class derived:public base 1,public base2
{
public:
    virtual void vf3(){}
privateint k;
);
void main()
{
    derived d;
    base1 p1;
    base2 p2;
    p1=&d;
    p2 =&d;
    p1->vf1();
    p2->vf2();
}


技术分享图片

如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样。

虚函数的底层实现机制、虚函数内存布局以及虚函数局限

标签:网址   fonts   类对象   tps   编译器   运行时   stream   语句   顺序   

原文地址:https://www.cnblogs.com/mini-coconut/p/9277815.html

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