标签:
问题描述
在看irrlicht源码时,注意到如下的继承方式:
class IrrlichtDevice: public virtual IRefenceCounted
{
…
};
不解,遂翻书查找得到解答,果然是书没认真看啊,同时就这点来说读代码是一种很好学习方法。
虚继承说明
在《c++ primer》中文版第五版的第717页作者举了一个例子【1】很好的说明了情况,这里我就照办了。
IO标准库的iostream和ostream分别继承了一个共有的名为base_ios的抽象基类。该抽象基类负责保存流的缓冲内容并管理流的条件状态。iostream是另外一个类,它从istream和ostream直接继承而来,可以同时读写流的内容。因为istream和ostream都继承自base_ios,所以iostream继承了base_ios两次,一次通过istream,另一次通过ostream。
这就导致了一个问题,一个iostream对象肯定是希望在同一个缓冲区中进行操作。所以如果有两份拷贝,则上述的共享就无法实现了。
在c++中,虚继承的目的是令某个类做出声明,承诺愿意共享它的基类。其中,共享的基类子对象称为虚基类。这样,不论虚基类在继承体系中出现了多少次,在派生类中都只包含唯一一个共享的虚基类子对象。
简单的说就是,为了解决B、C同时继承A,而D又继承B、C时,D中有两个A的副本的问题【2】。
参考索引
【1】《c++ primer中文版》:第五版 ,(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)
【2】http://bbs.chinaunix.net/thread-1782309-1-1.html
标签:
原文地址:http://www.cnblogs.com/keikain/p/4590518.html