虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。

类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:

A          A

\          /

B     C

\  /

D

而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:

A

/      \

B       C

\     /

D

代码如下:

class A;

class B:public virtual A;

class C:public virtual A;

class D:public B,public C;

例子1:

class A
{
   .
   .
   .
   public:
   int a;
   .
   .
   .
};
class B:virtual public A
{
    .
.
.
};
class C:virtual public A
{
    .
.
.
};
class D:public B,public C
{
   public:
   void f(int i)
   {
      a=i;
   }
};

此例中,对于类D而言,类A是类C的虚基类,是类B的真基类;但对于类C而言,类A仍是类C的真基类,虚基类只是一个相对的概念。

如果把上例子稍稍修改一下:

.
.
.
  class D:pbulic C,public B
.
.
.

则对于类D而言,类A是类B的虚基类,是类C的真基类。

#######################################

一个派生类对象的地址可以直接赋给虚基类的指针,不需要强制类型转换。例如:

D obj1;

A *ptr=&obj1;

并且,一个虚基类的引用可以引用一个派生类的对象,反之则不行,无论在强制类型转换中指定什么路径,一个虚基类的指针或引用不能转换为派生类的指针或引用。例如:

D obj2;

A &ref=obj2;

什么是虚继承?虚基类?相关推荐

  1. C++虚继承(七) --- 虚继承对基类构造函数调用顺序的影响

    继承作为面向对象编程的一种基本特征,其使用频率非常高.而继承包含了虚拟继承和普通继承,在可见性上分为public.protected.private.可见性继承比较简单,而虚拟继承对学习c++的难度较 ...

  2. 有虚继承的类其有几个虚继承的基类则该类就有几个虚表

    对于下面的测试代码(64位系统):C类继承了A  B 均为虚类,所以在结果中sizeof(C) 结果为32 #include<iostream> using namespace std; ...

  3. 多继承的二义性和虚继承(虚基类)

    一般来说,在派生类中对基类成员的访问是应该是唯一的.但是,由于在多继承的情况下,可能出现基类中某个成员的访问不唯一的情况,这称为对基类成员访问的二义性. 在多继承的情况下,通常有两种可能出现的二义性. ...

  4. [C++] - 纯虚函数 抽象基类 接口类

    翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...

  5. 在保护继承中基类的共有成员_C++学习大纲:继承方式的调整

    C++ 继承方式的调整 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制. 调整格式 [public: | protected: | private: ] :: ; ...

  6. 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式

    一.前言 本部分为C++语言刷题系列中的第13节,主要讲解这几个知识点:继承的实现.继承的方式.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:继承的实现,可以理解派生类拥有成 ...

  7. 虚继承,虚基类以及虚继承的构造函数

    目录 一.什么是虚继承,虚基类 二.定义虚继承的基本格式 三.虚继承的构造函数 一.什么是虚继承,虚基类 虚继承:在继承定义中包含了virtual关键字的继承关系 虚基类:在虚继承体系中的通过virt ...

  8. C++ 虚函数在基类与派生类对象间的表现及其分析

    近来看了侯捷的<深入浅出MFC>,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑.因为书中说了这么一句:使用"基类之指针"指向"派生类之对象&q ...

  9. 在保护继承中基类的共有成员_c++中的继承

    类的继承,是新的类从已有类那里得到已有的特性.从另一个角度来看这个问题,从已有类产生新类的过程就是类的派生. 派生类的定义 class 派生类名:继承方式 基类名1,继承方式 基类名2 {派生类成员声 ...

  10. 在保护继承中基类的共有成员_C#初学者教程系列11:继承

    本文是C#初学者简单教程,这是第11篇.感谢观看,记得关注我,后续还有更多教程文章,谢谢. 本文环境为Visual Studio 2019. 一.什么是继承 继承是面向对象编程的一种基本特性. 借助继 ...

最新文章

  1. 3dsmax biped 骨骼姿势 对称操作
  2. 剑指offer:树的子结构
  3. php 精度计算问题
  4. video4linux 安装,【精品博文】Video4linux 下视频编程的流程
  5. html里table的scope,HTML表格的运用
  6. havc是什么意思_avc是什么意?eduis里h.264/a – 手机爱问
  7. Python求解啤酒问题(携程2016笔试题)
  8. canvas.toDataURL()报错
  9. python控制电脑唤醒_python socket发送魔法包网络唤醒开机.py
  10. node 多进程 vs java_如何理解node的多进程
  11. 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
  12. Learning the Model Update for Siamese Trackers 论文学习
  13. 2022祥云杯crypto部分
  14. Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
  15. windows运行库文件
  16. 请问java如何跟isapi通讯,代码怎么实现?
  17. 关于阿里云视频点播出现的问题
  18. 【图像处理】HDF5 C++编程简介
  19. Windows10 的microsoft defender smartscreen怎么关闭的教程和方法?
  20. python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...

热门文章

  1. 未能加载文件或程序集 System Drawing Version 4 0 0 0 Culture neutral
  2. 【转载】 下个月,Java 开启收费模式!
  3. C#实现物体尺寸测量(利用坐标转换)
  4. git 错误:GnuTLS recv error (-54): Error in the pull function
  5. 简洁明了的刘海屏适配方案
  6. 2021-07-24 VMware workstation界面语言改为中文
  7. SDUT-OJ偏序关系
  8. 用maven驱动搜索dom4j异常,原因分析
  9. pytest报错 E ModuleNotFoundError解决办法
  10. word添加参考文献和标注的详细简单方法