C++虚继承:virtual public CParent
来源:互联网 发布:淘宝旺旺客服代码 编辑:程序博客网 时间:2024/05/22 02:18
今天在读《高质量程序设计指南--C/C++语言》第12章讲关于继承的例子12-9时,看到了:
class Socket
{
.........
}
class SocketImpl : virtual public Socket
{
.........
}
class ClientSocket : virtual public Socket
{
........
}
class ClientSocketImpl : public ClientSocket,private SocketImpl
{
........
}
这里实现了多重继承。一开始不明白此处virtual的用处,经过网上查阅,了解了一些,总结一下:
这个"virtual"是什么作用及含义?
证明这个SocketImpl、ClientSocket是Socket 的虚基类。
虚基类的作用:
虚基类是指:class SubClass : virtual public BaseClass 中以virtual声明的基类。由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。
典型的需要用虚基类的情况如下:
A
/ /
B C
/ /
D
其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承。一开始所讲述的就是一个很好的例子。
当ClientSocketImpl构造出来后,它的存储区域中只有一个Socket,不存在二义性问题。这是讲叙的最基本的意思。要想深入理解,网上有很多很好的文章,由于水平太菜,很多看不大很明白,暂时只好浅显的理解一下了。
如:参考百度文库--C++虚继承对象的内存布局:
http://wenku.baidu.com/view/a516063567ec102de2bd894f.html
陈皓的《C++ 对象的内存布局》图文并貌,写得很是详细。地址是http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx
玄机逸士的《对象内存布局》系列则几乎把每种可能性列出来了,尤为详尽。地址是http://blog.csdn.net/pathuang68/archive/2009/04/23/4101970.aspx
- C++虚继承:virtual public CParent
- C++虚继承:virtual public CParent的含义及作用
- C++虚继承:virtual public CParent的含义及作用
- virtual public CParent的含义及作用——虚基类
- virtual public(虚继承类)
- C++ virtual 继承
- C++virtual继承
- C++(2)继承/virtual
- C/C++:public公有继承
- C++:public继承、protected 继承、private继承
- C++:public继承、protected 继承、private继承
- C++:private继承与public继承
- C++:private继承与public继承
- C++:private继承与public继承
- [C++]virtual关键字:虚函数,虚继承和虚基类
- public、protect、private继承方式 C++(转)
- C++虚继承 (virtual inheritance)
- C++ - 虚继承(virtual inheritance)
- 数据结构中的几个算法
- 关于使用Winpcap发送数据包的心得
- 线程同步
- STL快排
- 层
- C++虚继承:virtual public CParent
- 基本过滤选择器
- 【转】 Android ListView 详解
- 链式编程-评分控件
- 《游戏人工智能》学习笔记
- 节点遍历
- springside3.3.4 运行quick-start.bat问题
- ANT入门学习笔记
- 隐式迭代