虚拟继承、虚函数学习总结
一、虚函数。
其实是比较简单的,它的存在就是为了给子类继承,并且提供多个接口,所谓多个接口,就是多态性,它的主要特点就是父类的指针可以指向子类的对象,这样的话,在继承上会有好处。例如,某个父类有多个子类,在不知道会调用哪一个子类对象的情况下,可以定义一个父类的指针
f
,这样就实现了所谓的“接口”功能,在知道了要使用哪一个子类的时候,就直接把父类的指针
f
指向那个子类的对象,以后的操作都是采用父类的指针
f
,这样显然就有优点了,可以把对子类的操作封装起来,跟它使用哪一个子类没有关系了,因为在被封装起来的操作里面操作的对象是父类的指针
f
,然后这些被封装的操作就提供了一个“接口”,要用哪一个类的对象,就把那一个类对象的地址给父类的指针
f
。
二、虚函数非虚拟继承
CSDN
的博客上有一篇文章《
C++
虚函数表解析》,作者:陈皓
网址:
http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx
说的是虚函数在内存中的格局,讲得很好理解。通过
vs2005
调试查看内存也是一样的。就是虚函数表。
三、虚拟继承。
CSDN
的博客上有一篇文章《
C++
对象内存布局》,作者:陈皓
网址
http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx
里面讲述了
c++
虚函数的各种继承的内存布局,讲得非常详细,大部分的内容都很容易看懂,但是在
讲解虚拟继承上还有一点不足,就是虚函数的虚拟继承漏了一点内容,虚基函数表(vbtbl)
的相关内容。
另一篇文章写得很好,也是CSDN
博客上的,《
c++
虚继承对象的内存布局
》
网址:
http://blog.csdn.net/BlueDog/archive/2009/10/22/4711169.aspx
在《
C++
对象内存布局》有一个名词叫做“钻石型虚拟多重继承”,之前不知道该怎么称呼这种继承,画成图,它们的形状就像棱形,一个基类产生两个子类,两个子类又同时被另一个“孙类”虚拟继承,最简单的虚拟继承就是这样子。
1、
没有涉及虚函数的虚拟继承。如果不管内部如何实现,简单的说就是“孙类”只拷贝一次基类,如果涉及到内存布局,那就必须通过
debug
,查看执行时的内存,
《
c++
虚继承对象的内存布局
》说到了这一点。通过内存查看“孙类”对象的地址,这个地址就相当于有虚函数的虚拟继承的“
Virtual Base Class Table
”简称“
VBTBL
”,当然名称可能有点问题,因为它只是包含用来寻找虚基类表的偏移值,而不是虚基类表的指针。在没有虚函数的情况下,它保存的内容同样有两项(因为只有一个基类),第一项为
0
,因为没有虚函数,第二项为本地址相对于基类的偏移值。从“孙类”的内存中发现,基类的内容放在在最后面,这也跟有虚函数的时候一样。可能是为了跟有虚函数的时候统一,格式是一样的,这样的话,在没有虚函数的时候,有些是没有用的,如
B
子类也有个类似于“
VBTBL
”的东西,如果没有理解错的话,它应该是没用的,访问基类的时候用不着它。在查看内存的时候还发现了一些现象,内存里面没有函数的地址,只有变量空间,这个大概就是非虚函数跟虚函数的不同吧。通过查看内存可以很好的理解底层的东西。
2、
含有虚函数的虚拟继承。这就涉及到了虚函数表、虚基类、
VBTBL
。
《
c++
虚继承对象的内存布局
》里面说得很详细,那个“孙”类对象的内存结构图看起来非常的明确,我在
vs2005
里面查看,完全一样。
3、
总结:有虚拟继承的“孙”类的对象的内存格局是这样的,被虚拟继承的基类放在最后,子类按顺序放在基类的前面。子类的对象的内存格局,基类也是放在最后。虚拟继承的每一个类都有“
VBTBL
”之类的东西。
分享到:
相关推荐
要求:1、虚函数 多态 多态表现为 基类 基类指针和继承间的关系 2、带有多对象成员。定义 3、体现继承 虚拟继承(要通过至少三层 父类父类子类) 虚函数 (3层 纵向关系) 水平方向上:体现出继承顺序 先虚拟继承 ...
可见性继承比较简单,而虚拟继承对学习c++的难度较大。 首先,虚拟继承与普通继承的区别有: 假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误; ...
C++实验六 多态性和虚函数的应用 课程 实验报告 作业参考的良品!
多态的实现及虚函数
c++虚拟继承的一个典型例子,通过这个例子可以让初学者从根本体会到虚拟继承是怎么回事
Linux起源和发展是一段令人着迷的历史。这里面包含这太多颠覆“常理”的事件和思想,促成Linux成长壮大的“神奇”力量总是被人津津乐道,Linux所创造的传奇有时候让初次接触它的人感到不可思议。
思科ASA虚拟防火墙学习总结 网上转载 很经典
虚拟函数信号发生器虚拟函数信号发生器虚拟函数信号发生器虚拟函数信号发生器
虚拟函数发生器虚拟函数发生器虚拟函数发生器虚拟函数发生器
思科ASA虚拟防火墙学习总结,欢迎大家学习,参与讨论!!
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、...
C++虚拟函数表的详细描述,从虚函数的实现机制上面为大家 一个清晰的剖析
虚拟函数的使用范例,通俗易懂,让初学者对虚拟函数有一个大体的印象
Linux调度和虚拟内存学习总结
XP创建虚拟Z盘第二步使用工具,可以创建出一个虚拟的Z盘
思科ASA虚拟防火墙学习总结.pdf
C++写DLL给VB用,包括VB6.0的例子,例程是封装NI虚拟仪器的函数.搞仪器控制的非常值得学习!
仅仅是一个讨论使用的样例程序,详细内容参考:http://blog.csdn.net/magictong/article/details/22202393
通过带有虚函数的单一继承我们可以清楚的理解继承的概念、对象模型的分布机制以及动态绑定的发生,即可以完全彻底地理解多态的思想。为了支持多态,语言实现必须在时间和空间上付出额外的代价(毕竟没有免费的晚餐,...
虚拟站点查询工具.7z虚拟站点查询工具.7z虚拟站点查询工具.7z虚拟站点查询工具.7z虚拟站点查询工具.7z