首页 > 其他 > 详细

类中含有虚函数的剖析

时间:2016-04-11 07:33:07      阅读:244      评论:0      收藏:0      [点我收藏+]

1. 源代码

#include <iostream>

using namespace std;


class Base

{

public :


virtual void  FunTest()

{

cout << "Base::FunTest () " << this << endl;

}

virtual void  FunTest1()

{

cout << "Base::FunTest1 () " << this << endl;

}

virtual void  FunTest2()

{

cout << "Base::FunTest2 () " << this << endl;

}

};


class Der : public Base

{

public:

virtual void  FunTest1()

{

cout << "Der::FunTest1 () " << this << endl;

}

virtual void  FunTest2()

{

cout << "Der::FunTest2 () " << this << endl;

}

};


void Test()

{

Base b;

Der  d;


Base *pb = &b;


pb->FunTest();

pb->FunTest1();

pb->FunTest2();


}


int main()

{

Test();


getchar();

return 0;

}


运行后的结果 :


技术分享


先来看看Base类创建的对象有多大

技术分享

然而用sizeof(b)时结果却为4 ,这是什么情况

用监视可以看到在取地址d,下面放的是一个地址,而我们知道地址就是4个字节的大小(见内存1)

其实这个地址有名字的叫做虚表地址


但是这个地址下有存储些什么东西(见内存2)



技术分享


可以清晰的看到这貌似像一个表里面存储的是在Base类那些虚函数的地址,其实它叫虚表


2.pb->FunTest();这一句是如何实现的,那就要看看编译器做了些什么了


技术分享

在第三步中,语言有点欠缺,就是并不是直接将eax中内容直接给 eax,又是会根据在虚表中存储的位置有所变动,


4.还有一种情况就是Base类的指针指向派生类Der的对象时,是什么情况,


源码变动:

void Test()

{

Base b;

Der  d;


Base *pb = &b;


pb->FunTest();

pb->FunTest1();

pb->FunTest2();


}


看好了,派生类中只是对基类的虚函数FunTest()没有重写,其他两个都重写了


运行结果:


技术分享


分析方法和上面一样,不啰嗦了

技术分享


本文出自 “埋葬的记忆” 博客,请务必保留此出处http://bitersl.blog.51cto.com/10756929/1762408

类中含有虚函数的剖析

原文:http://bitersl.blog.51cto.com/10756929/1762408

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!