1 / 9
文档名称:

探索C 虚函数在内存中的表现形式及运行机制(一).doc

格式:doc   大小:16KB   页数:9页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

探索C 虚函数在内存中的表现形式及运行机制(一).doc

上传人:学习好资料 2021/8/3 文件大小:16 KB

下载得到文件列表

探索C 虚函数在内存中的表现形式及运行机制(一).doc

文档介绍

文档介绍:探索C 虚函数在内存中的表现形式及运行机制(一)
本文是我在科锐学****完一阶段的一个总结文章,几个月前就写好了,最近看雪支持了markdown,所以就赶紧发出来支持下。同时感谢科锐戚老师的耐心教导!文章概要从简单地例子来进行探索,但是篇幅较长,建议先仔细阅读下目录结构再阅读文章,便于跳读和回顾。
前面一段是简单地铺垫,然后观察单层继承下的虚表指针和虚表,分析了不同情况下它们的表现形式,并手动模拟了虚函数的跳转。在中间插了一段需要注意的间接调用问题和重载、覆盖、隐藏的区别,来指出使用继承和虚函数时需要注意的地方。最后分析了在构造析构、多重继承和菱形继承的下虚表指针和虚表的表现形式。
如果仅仅需要了解虚函数的实现机制,不想看这么多的内存数据就直接看这篇文章吧 / (但如果对虚函数实现机制还比较模糊,也建议先花几分钟看下这边文章再回头来看内存吧) 编译环境:win7 32bit vs2013 平台工具集:Visual Studio 2013 - Windows Xp (v120_xp)引言:虚函数与多态
本部分是基本概念的简单表述,可以跳过 ^_^ 在面向对象编程最重要的思想就是多态,而多态是通过虚函数来实现的,虚函数在继承中使用。这里我们就探究探究虚函数的编译器对虚函数的实现及其在内存中的表现形式。继承与虚函数什么情况下需要用到继承?
在创建多个类时,会出现由于数据的重复而导致接口(方法/函数)的重复,于是就产生了冗余。我们可以通过组合的方式来解决冗余问题,但又产生了很多层不必要的调用。这时就需要继承——一个类可以继承/获取另一个类的部分数据成员和方法——来解决以上问题(这里为什么说是部分数据成员和方法,这和类权限问题相关,不做讨论)
一个简单的继承例子:游戏中有各种各样的角色,现在我们需要创建两个角色:枪手和骑兵。我们也只需要他们基本的操作:攻击和血量 于是就需要两个类:枪手类和骑兵类。这时我们发现,他们都需要存储血量的数据成员和攻击的成员方法,这时就可以创建一个具有这两个的士兵类让他们继承。
代码
为了演示方便就没有分开头文件、声明和实现
#include // 士兵类,具有血量数据成员和攻击方法class CSoldier{ public: CSoldier() : m_nBlood(0x20) { /* Nothing to do */ } ~CSoldier() { std::cout } void attack() { std::cout } protected: int m_nBlood;}; // 枪手类,继承士兵类,并覆盖士兵类攻击方法class CGuner : public CSoldier{ public: CGuner() : CSoldier() { /* Nothing to do */ } ~CGuner() { std::cout } void attack() { std::cout }}; // 骑士类,继承士兵类,并覆盖士兵类攻击方法class CKnight : pu