什么是虚继承?虚基类?
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。
类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;
什么是虚继承?虚基类?相关推荐
- C++虚继承(七) --- 虚继承对基类构造函数调用顺序的影响
继承作为面向对象编程的一种基本特征,其使用频率非常高.而继承包含了虚拟继承和普通继承,在可见性上分为public.protected.private.可见性继承比较简单,而虚拟继承对学习c++的难度较 ...
- 有虚继承的类其有几个虚继承的基类则该类就有几个虚表
对于下面的测试代码(64位系统):C类继承了A B 均为虚类,所以在结果中sizeof(C) 结果为32 #include<iostream> using namespace std; ...
- 多继承的二义性和虚继承(虚基类)
一般来说,在派生类中对基类成员的访问是应该是唯一的.但是,由于在多继承的情况下,可能出现基类中某个成员的访问不唯一的情况,这称为对基类成员访问的二义性. 在多继承的情况下,通常有两种可能出现的二义性. ...
- [C++] - 纯虚函数 抽象基类 接口类
翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...
- 在保护继承中基类的共有成员_C++学习大纲:继承方式的调整
C++ 继承方式的调整 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制. 调整格式 [public: | protected: | private: ] :: ; ...
- 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式
一.前言 本部分为C++语言刷题系列中的第13节,主要讲解这几个知识点:继承的实现.继承的方式.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:继承的实现,可以理解派生类拥有成 ...
- 虚继承,虚基类以及虚继承的构造函数
目录 一.什么是虚继承,虚基类 二.定义虚继承的基本格式 三.虚继承的构造函数 一.什么是虚继承,虚基类 虚继承:在继承定义中包含了virtual关键字的继承关系 虚基类:在虚继承体系中的通过virt ...
- C++ 虚函数在基类与派生类对象间的表现及其分析
近来看了侯捷的<深入浅出MFC>,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑.因为书中说了这么一句:使用"基类之指针"指向"派生类之对象&q ...
- 在保护继承中基类的共有成员_c++中的继承
类的继承,是新的类从已有类那里得到已有的特性.从另一个角度来看这个问题,从已有类产生新类的过程就是类的派生. 派生类的定义 class 派生类名:继承方式 基类名1,继承方式 基类名2 {派生类成员声 ...
- 在保护继承中基类的共有成员_C#初学者教程系列11:继承
本文是C#初学者简单教程,这是第11篇.感谢观看,记得关注我,后续还有更多教程文章,谢谢. 本文环境为Visual Studio 2019. 一.什么是继承 继承是面向对象编程的一种基本特性. 借助继 ...
最新文章
- 3dsmax biped 骨骼姿势 对称操作
- 剑指offer:树的子结构
- php 精度计算问题
- video4linux 安装,【精品博文】Video4linux 下视频编程的流程
- html里table的scope,HTML表格的运用
- havc是什么意思_avc是什么意?eduis里h.264/a – 手机爱问
- Python求解啤酒问题(携程2016笔试题)
- canvas.toDataURL()报错
- python控制电脑唤醒_python socket发送魔法包网络唤醒开机.py
- node 多进程 vs java_如何理解node的多进程
- 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
- Learning the Model Update for Siamese Trackers 论文学习
- 2022祥云杯crypto部分
- Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
- windows运行库文件
- 请问java如何跟isapi通讯,代码怎么实现?
- 关于阿里云视频点播出现的问题
- 【图像处理】HDF5 C++编程简介
- Windows10 的microsoft defender smartscreen怎么关闭的教程和方法?
- python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...
热门文章
- 未能加载文件或程序集 System Drawing Version 4 0 0 0 Culture neutral
- 【转载】 下个月,Java 开启收费模式!
- C#实现物体尺寸测量(利用坐标转换)
- git 错误:GnuTLS recv error (-54): Error in the pull function
- 简洁明了的刘海屏适配方案
- 2021-07-24 VMware workstation界面语言改为中文
- SDUT-OJ偏序关系
- 用maven驱动搜索dom4j异常,原因分析
- pytest报错 E ModuleNotFoundError解决办法
- word添加参考文献和标注的详细简单方法