博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++当中的virtual继承
阅读量:5965 次
发布时间:2019-06-19

本文共 1433 字,大约阅读时间需要 4 分钟。

今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:

父类:  
class   CParent  
{  
....  
};  
继承类的声明比较特别:  
class   CChild   :   virtual   public   CParent  
{  
....  
}  
请问,这个"virtual"是什么作用及含义?  
---------------------------------------------------------------  
表示虚拟继承,和普通继承是C++的两种继承方式。  
例如B1、B2   继承A   而C多重继承B1、B2  
如果普通继承则C包含两份A的拷贝,分别来自于B1、B2  
而虚拟继承则只包含一份A的拷贝  
---------------------------------------------------------------  
这个"virtual"是什么作用及含义?  
证明这个CParent是CChild   的虚基类  
虚基类   的   作用  
虚基类是指:class   SubClass   :   virtual   public   BaseClass   中以virtual声明的基类!!由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了 
典型的需要用虚基类的情况如下:  
                        A  
                      /   \  
                    B       C  
                      \   /  
                        D  
其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承  
程序嘛…………  
class   A   {  
    public:  
        void   printA()   {cout<<"this   is   A\n";}  
};  
class   B:virtual   public   A;  
class   C:virtual   public   A;  
class   D:public   B,public   C;  
这样在D构造出来后,它的存储区域中只有一个A,不会有二义性问题  
比如:D   d=new   D;  
此时若使用d.printA();不会有问题;但若B和C不是虚继承自A,就会有二义性问题 
COM中 多重继承不采用虚拟继承, 否则会导致与COM不兼容的vtbl。若 IX 和 IY 按照虚拟继承方式继承IUnknown,那么 IX 和 IY 的vtbl中的头三个函数指向的将不是IUnknown的三个成员函数(详见Com技术内幕)
IUnknown        ->            IX                         
                                                    --->        CA 
IUnknown        ->            IY 
通常将一种类型的指针转换成另外一种类型的指针并不会改变指针的值,但为了支持多重继承,在某些情况下,C++必须改变类指针的值。COM中的多接口继承就是如此,此时 
CA* pA = new CA(); 
IY * pc = pA;                                  会被编译器改成   IY * pC = (char * )pA + deltaIY(一个偏移量);
基类的析构函数也应该定义成virtual才会在继承类的实例析构时被调用以清除基类用到的资源。 

来源:http://blog.csdn.net/yushuai007008/article/details/7437592

转载于:https://www.cnblogs.com/jevin/p/3640577.html

你可能感兴趣的文章
css+div+jquery弹出层
查看>>
求职相关(链接,不定期更新)
查看>>
pdo 连接数据库 报错 could not find driver 解决方法
查看>>
maya pyside 多个窗口实例 报错 解决
查看>>
我的友情链接
查看>>
通知中心
查看>>
我的友情链接
查看>>
MVC中的三个模块
查看>>
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
查看>>
oracle 常用命令大汇总
查看>>
2012年春运火车票电话和网上订票技巧、攻略
查看>>
根据request获取请求路径
查看>>
mysql 并行复制
查看>>
傲不可长,欲不可纵,乐不可极,志不可满——提高个人修养
查看>>
linux系统增加swap容量的方法
查看>>
后台调用gps
查看>>
HTML5标签的语义认知和理解(1)
查看>>
MySQL日志功能详解(2)
查看>>
HP LaserJet 305X 和 339X 系列一体机如何设置手动或自动接收传真?
查看>>
linux之权限之隐藏权限
查看>>