`
isiqi
  • 浏览: 16058834 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

virtual继承, 虚基类

阅读更多

父类:
class CParent
{
....
};
继承类的声明比较特别:
class CChild : virtual public CParent
{
....
}
请问,这个"virtual"是什么作用及含义?
---------------------------------------------------------------

表示虚拟继承,和普通继承是C++的两种多重继承方式。
例如CB1、CB2 继承CA 而CC多重继承CB1、CB2
如果普通继承则CC包含两份CA的拷贝,分别来自于CB1、CB2
而虚拟继承则指包含一份CA的拷贝


---------------------------------------------------------------

这个"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,就会有二义性问题

分享到:
评论

相关推荐

    C++ 内存布局虚继承 ---Empty virtual base classs (空虚基类)

    C++ 内存布局虚继承 ---Empty virtual base classs (空虚基类).doc

    c.c++找工作面试重点结构图-mindmanager

    在虚继承体系中的通过virtual继承而来的基类 继承子类与父类关系 具体化 类的层次通常反映了客观世界中某种真实的模型。在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化。基类抽取...

    C++上机实验报告-实验五.docx

    采用类的派生的方法,利用基类派生出子类,子类继承基类的属性,从而在已有基类的基础上设计新的派生类,模式如下: class 派生类名:继承方式 基类名1,继承方式 基类名2,…,继承方式 基类名n { 派生类成员声明;...

    C++类的虚函数虚继承所占的空间

     继承会继承基类的数据, 和虚函数表, 即继承基类的空间.  代码: /* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include using namespa

    C++程序设计_中型项目 游戏"双人大战"的控制台实现.pdf

    3.对虚基类(virtual base class),派生类,类的实例化,动态联编(dynamic binding)等体现面向对象多态性内容的体现; 4.小组合作完成同意大型项目的配合能力,; 在实际操作方面,本次试验重点训练了: 1.继承关系的创建,...

    C++多重继承与虚继承分析

    本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类...

    解析C++编程中virtual声明的虚函数以及单个继承

    假定基类包含声明为 virtual 的函数,并且派生类定义了相同的函数。 为派生类的对象调用派生类中的函数,即使它是使用指针或对基类的引用来调用的。 以下示例显示了一个基类,它提供了 PrintBalance 函数和两个派生...

    C++编程知识点1

    声明纯虚函数的类是抽象类,不能实例化只包含纯虚函数的抽象类称为接口,接口不能用虚方法和不能包含已经实现的方法,也不能实例化。基类被虚继承才是虚基类virtual

    从汇编看c++的虚拟继承以及其内存布局

    先看第一种简单的情形,所有类中没有任何虚函数的菱形继承。  下面是c++源码: class Top {//虚基类 public:  int i;  Top(int ii) {  i = ii;  } }; class Left : public virtual Top { public: ...

    浅析C++中的虚函数

    定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 二、作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在...

    深入理解c++中virtual关键字

    virtual可用来定义类函数和应用到虚继承。 友元函数 构造函数 static静态函数 不能用virtual关键字修饰;普通成员函数 和析构函数 可以用virtual关键字修饰; 3.virtual函数的效果 代码如下:class GrandFather{...

    计算正方体、圆柱体的表面积、体积

    从立方体、圆柱体抽象出一个公共基类Container,定义抽象类Container...Cube类、Cylinder类均继承抽象类Container。 Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。 在主函数用new运算

    C语言干货

    2. 虚函数:在基类中冠以关键字 virtual 的成员函数。它提供了一种接口界面。允许在派生类中对基类的虚 函数重新定义。 3. 纯虚函数:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为...

    C++实验源代码

    在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 6) 参考题目2中Cline类的编写,编写一个空间中线段CThreeLine类。并在该类中观察构造函数的执行顺序。(选做)

    C++实验报告

    在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 6) 参考题目2中Cline类的编写,编写一个空间中线段CThreeLine类。并在该类中观察构造函数的执行顺序。(选做)

    关于C++中虚拟继承的一些总结分析

    虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的...

    C++ 多重继承和虚拟继承对象模型、效率分析

    而动态绑定则是从语言的底层实现保证了多态的发生——在运行期根据基类指针或者引用指向的真实对象类型确定调用的虚函数功能!通过带有虚函数的单一继承我们可以清楚的理解继承的概念、对象模型的分布机制以及动态...

    C++ 虚函数专题

    基类中使用virtual关键字声明的函数,称为虚函数。 虚函数的实现,通过虚函数表来实现的。即V-table 这个表中有一个类,用于储存虚函数的地址。解决其继承,覆盖的问题,用于保证其真实反映的函数。这样有虚函数的...

    C++的那些事:面向对象

    1 OOP概述 ...在C++中,基类必须指定希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,需要在派生类中继承的不能定义为虚函数。  派生类重新定义的虚函数前面可以加virtual

Global site tag (gtag.js) - Google Analytics