今天在读《高质量程序设计指南--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