C++中virtual继承的深入理解

所属分类: 软件编程 / C 语言 阅读数: 58
收藏 0 赞 0 分享
今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:
父类: 
复制代码 代码如下:

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才会在继承类的实例析构时被调用以清除基类用到的资源。
更多精彩内容其他人还在看

C++无法重载点符号、::、sizeof等的原因

这篇文章主要介绍了C++无法重载点符号、::、sizeof等的原因的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

实例讲解C语言编程中的结构体对齐

这篇文章主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言的结构体中成员变量偏移问题

这篇文章主要介绍了C语言的结构体中成员变量偏移问题,以讲解如何编写宏来对成员变量进行修改为主,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言结构体中的函数指针

这篇文章主要介绍了详解C语言结构体中的函数指针,文中对函数指针的基本概念也有讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

C++编程中的函数指针初步解析

这篇文章主要介绍了C++编程中的函数指针初步解析,函数指针在C语言和C++学习中都是非常重要的知识,需要的朋友可以参考下
收藏 0 赞 0 分享

实例解析C++中类的成员函数指针

这篇文章主要介绍了C++中类的成员函数指针,例子中以讨论用函数指针调用类的成员函数为主,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的函数指针基础学习教程

这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
收藏 0 赞 0 分享

深入解析C语言中函数指针的定义与使用

这篇文章主要介绍了C语言中函数指针的定义与使用,是C语言入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言编程中的函数指针以及函数回调

这篇文章主要介绍了C语言编程中的函数指针以及函数回调,函数回调实际上就是让函数指针作函数参数、调用时传入函数地址,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的函数指针学习笔记

这篇文章主要介绍了C语言中的函数指针的一些学习知识点记录,文中作者整理了一些比较interesting的函数指针用法,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多