目录

前言

虚基类的作用

虚基类的声明

虚基类的初识化


前言

在上一篇的文章中我们知道了, C++语言是知识多继承的,并且一个子类可以有多个父类子类,拥有所有父类的成员变量,子类会继承父类的所有成员函数,而且子类的对象也可以被父类的任意对象使用

虚基类的作用

如果一个类中有多个直接的基类,并且这些直接的基类又有有一个共同的基类,则在最低层的派生类中就会保留这个间接的共同基类数据成员的多份同名成员,在我们下次访问,这些同名成员的时候,必须在派生类的对象名后直接增加基类名,并唯一的标识一个成员,这样会避免产生二义性

虚基类的声明

从之前的声明我们不难理解,如果类中只存在一个拷贝,(就是说如果只存在一个数据成员X)那么对X的访问就不会产生二义性,在C++中我们可以通过对这个公共的基类声明为虚基类来解决这个问题,这就会使用到我们接下来要讲解的关键字virtual ,virtual可以将一个类声明为虚基类

声明虚基类的语法形式如下:

class 派生类名:virtual 继承方式 类名{…………
}

虚基类的初识化

虚基类的初始化与一般的多继承的初始化上的语法是一样的,但是要注意的一点是构造函数的调用顺序不同,在使用虚机类的机制时,应该注意以下的这几点 :

  • 注意点一、如果在虚基类类的定义有带形参的构造函数,并且是没有定义默认形式的构造函数,那么在整个继承结构之中,所有间接或者直接引用的派生类,都必须在构造函数的成员初始化列表中指出对虚基类构造函数的调用,用来初始化,在虚基类中定义的数据成员。
  • 注意点二、在我们建立一个新的对象的时候,如果这个对象中含有从虚基类中继承而来的成员,那么虚基类的成员是由最远的派生类的构造函数通过对该虚基类的构造函数进行调用来进行初始化的,该派生类中的其他基类对虚基类构造函数的调用都会被编译系统自动忽略
  • 注意点三、对于同一程序中既包含虚基类也包含非虚基类,那么我们会自动调用虚基类中的构造函数,然后才调用非虚基类中的构造函数,最后是调用派生类的构造函数
  • 注意点四、对于如果有多个虚基类构造,函数的执行顺序,仍然是按先左后右自上而下的顺序,但是对于非虚基类的构造,函数的执行顺序依然是先左后右,自上而下,若虚基类是由非虚基类派生而来的,那么我们仍然是先会调用基类中的构造函数,然后才调用派生类中的构造函数

最后我们就来看这个栗子:观察它是否运行正常,它的结果又是什么?

#include <iostream>
using namespace std;
class B : public A
{
public:B() { cout << 'is b'; }int b;
};
class C : public A
{
public:C() { cout << 'is c'; }int c;
};
class D : public B, public C
{
public:D() { cout << 'is d'; };int d;
};
int main()
{D d;return 0;
}

C++中虚基类相关的知识点相关推荐

  1. 多继承中虚基类构造函数的一种调用规则

    规则:如果父类中有虚基类(A),且有一个直接基类(B)是虚基类的子类,那么子类(C或D)若不显式调用虚基类的有参数构造函数,它的直接基类(B)即使在构造列表中调用了非默认构造函数,那么也会直接调用虚基 ...

  2. java 虚基类_C++中虚基类与抽象类的简单理解。

    虚基类   是相对于它的派生类而言的,它本身可以是一个普通的类. 只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类.比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有 ...

  3. c++程序设计中虚基类,多继承知识点

    一.前言 如上 二.题目 分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派 生出新类Teacher_Cadre(教师兼干部)类.要求: (1)在两个基类中都包含姓名 ...

  4. C++虚继承中的虚基类表

    虚继承主要解决多重继承会在子类中存在多份拷贝的问题,这不仅浪费空间,而且存在二义性. 在之前的 C++ 继承中已经说过虚继承基本概念,这里不再赘述.这篇文章主要探究虚继承的原理.文章中多处给出了类实例 ...

  5. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

  6. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  7. c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

    在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...

  8. c++中的虚特性(虚基类、虚函数、纯虚函数)

    1. 虚基类 1.1 虚基类作用 为了解决多继承时的命名冲突和冗余数据问题,使得派生类中只保留一份间接基类的成员. 其本质是是让某个类做出声明,承诺愿意共享它的基类.其中,这个被共享的基类就称为虚基类 ...

  9. 避免在派生类中重新定义基类的非虚函数

    我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态.这么说来,在派生类中重定义(override)虚函数是没有任何问题 ...

最新文章

  1. 南京信息工程大学滨江学院计算机科学与技术专业,南京信息工程大学滨江学院有哪些专业及什么专业好...
  2. ARMS为深绘智能系统保驾护航
  3. 开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源
  4. java byte 二维数组_[编程入门]二维数组的转置-题解(Java代码)
  5. 作者:曹建峰,男,腾讯研究院版权研究中心研究员,主要从事网络安全、数据保护、网络版权与内容产业等互联网法律政策研究工作。...
  6. 海量个人信息被泄漏 央视首次曝光智能呼叫机器人
  7. 介绍6款热门的SpringCloud微服务开源项目,总有适合你的!
  8. (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
  9. Intel SDM Chapter 10: APIC
  10. android_dialog
  11. 7-7 找最小的字符串 (15 分)
  12. 真心干货:一起学习阿里巴巴数据中台实践!首次公开!
  13. Oracle数据库常用脚本
  14. tbschedule 前后置处理器、定期执行任务
  15. BUUCTF:[XMAN2018排位赛]file
  16. 积木创意:APP开发需要注意哪些事项?
  17. Android神兵利器之黄油刀的使用(ButterKnife)
  18. mtk系统定制注意事项—
  19. p2p传输实时视频流
  20. rhel7 http实例

热门文章

  1. Activity Diagram(活动图)几个重要节点
  2. 计算机网络时钟同步怎么理解,时钟与计算机网络中的时钟同步.pdf
  3. 删,删,删,就知道删!
  4. Glow: Generative Flow with Invertible 1×1 Convolutions翻译
  5. Hidemyass优惠券如何获得的折扣HMA
  6. 树莓派造服务器(三):内网穿透方案
  7. 靓仔的实习笔记(1)
  8. 折线迷你图怎么设置_Office小技巧-在EXCEL单元格中也可以有迷你折线图-迷你office...
  9. python处理钉钉回调事件中的消息体加解密
  10. Symantec Backup Exec 系列三:配置存储