news 2026/6/22 5:11:00

多继承与虚基类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多继承与虚基类

多继承派生类的语法格式:

class 派生类名 : <继承方式1> 基类名1,

<继承方式2> 基类名2,

…… {

……//派生类新添加的成员

};

多继承派生类对象的构造和析构:

派生类名(参数表):基类名1(参数表1),

基类名2(参数表2),

对象成员1(参数表3),

对象成员2(参数表4),

… {

//派生类新添加的成员

}

派生类构造执行顺序是按照:基类对象、成员对象、普通变量的高到低优先级执行的,其中其中基类对象的调用顺序和声明继承关系的顺序有关。

但是析构函数的执行顺序与之相反,先调用派生类的析构函数,再调用对象成员的析构函数,最后调用基类的析构函数。

访问不同基类同名成员时的二义性

class A{ public: int value; void f(){}; }; class B{ public: int value; void f(){}; void g(){}; }; class C: public A, public B{ public: void g(){}; void h(){}; }; int main(){ C C1; C1.f(); C1.value=9; return 0; }

这里在调用f()和value时会出现二义性,因为编译器不知道你访问的是A和B中的哪一个()和value。

所以在此我们需要填写他的“绝对路径”,类名对成员加以限定:改成:

int main(){
C C1;
C1.A::f();
C1.A::value=9//访问A的f()和value。
return 0;
}

第二种情况:

class A{ public: int a; void g( ){}; }; class B1: public A{ int b1; }; class B2: public A{ int b2; }; class C: public B1, public B2{ int c; public: int f(){}; }; int main(){ C Cobj; Cobj.a=8; Cobj.A::a=9; Cobj.g( ); return 0; }

这一二义性的冲突是因为B1、B2都有一个公共基类A,这个公共基类会在派生类对象中产生两个基类子对象,于是我们也要来对此进行限定:

Cobj.B1::a=9;或 Cobj.B2::a=9;

但是这还有一个问题,使用绝对路径找到的基类,我们也可以得知派生类对象中存在多个基类对象的拷贝,导致空间浪费,解决方法也很简单,将A设为虚基类即可,这样 B1 和 B2 继承 A 时,C 最终只会保留一份 A 的子对象,就不会有二义性了。

虚基类

虚基类子对象被合并成一个子对象,这种“合并”作用,使得可能出现的二义性被消除。下面是使用虚基类与没使用虚基类的概念图:

class A { public: int a = 10; void g() { cout << "A的g()函数,a=" << a << endl; } }; // B1虚继承A class B1 : virtual public A {}; // B2虚继承A class B2 : virtual public A {};

虚基类构造函数的调用次序有着自己独特的次序,规则:

1:对于最终派生类来说,虚基类的构造必须在非虚基类之前调用;

2:同一个层次中包含多个虚基类,那么按照虚基类构造函数按它们说明的次序调用。

若虚基类由非虚基类派生,则遵守先调用基类构造函数,再调用派生类构造函数的规则。

举个栗子:

class base{…}; class bas2{…}; class level1 : public base2, vitrual public base{…}; class level2 : public base2, vitrual public base{…}; class toplevel : public level1, vitrual public level2{…};

声明toplevel 时,构造顺序是从 “最顶层虚基类” 开始,再到 “普通基类 / 中间类”,最后到自身

第一步,先调用全局虚基类

base被level1、level2都虚继承了,所以base是全局虚基类,会被优先构造且只构造 1 次→ 顺序第 1 位:base

第二步,按照规则优先调用虚基类

level2是toplevel的虚基类,所以要先构造level2(规则1),而构造level2时,要先构造它的基类:
level2的基类:base2(普通,先构造) + base(虚基类,已经构造过了,不再构造)(规则2
→ 顺序第 2-3 位:base2(level2 的普通基类) → level2

第三步

level1是toplevel的普通基类,构造level1时,要先构造它的基类:
level1的基类:base2(普通,先构造) + base(虚基类,已构造)(规则2
→ 顺序第 4-5 位:base2(level1 的普通基类) → level1

第四步

最后构造toplevel→ 顺序第 6 位:toplevel

综合

base(全局虚基类)→ base2(level2 的普通基类)→ level2(toplevel 的虚基类)→ base2(level1 的普通基类)→ level1(toplevel 的普通基类)→ toplevel

例2:

class base{…}; class base2{…}; class level1 : virtual public base2, virtual public base{…}; class level2 : virtual public base2, virtual public base{…}; class toplevel : public level1, virtual public level2{…};

同样的道理,但不同的是level1和level2都是虚基类。

此时base与base2都是全局变量,当有多个全局虚基类时,构造顺序遵循:
最终派生类继承链中,虚基类首次出现的 继承声明顺序排序。

最终派生类toplevel的继承链中,base2和base首次出现在level1、level2的继承声明里,且声明顺序是base2在前、base在后 → 先构造base2,再构造base。所以按照构造顺序定下base2为第一位,basee为第二位。

再通过规则1优先构造toplevel的虚基类level2为第三位,再构造普通类level1为第五位,最后构造自身toplevel。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 2:32:31

MinIO对象存储搭建与S3兼容实战

本文详解MinIO对象存储的部署配置、S3兼容API使用、分布式集群搭建等实践。 前言 对象存储越来越重要&#xff1a; 海量非结构化数据存储图片、视频、备份文件云原生应用标配 MinIO是最流行的开源对象存储&#xff1a; S3 API 100%兼容高性能&#xff08;单节点可达100Gbps…

作者头像 李华
网站建设 2026/6/18 10:31:23

探索macOS开源应用的世界:从入门到精通

探索macOS开源应用的世界&#xff1a;从入门到精通 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库&#xff0c;这些应用程序涉及到各种领域&#xff0c;例如编程、生产力工具、游戏等。对于开发…

作者头像 李华
网站建设 2026/6/10 5:55:30

5分钟精通YOLOv9模型评估:从零基础到实战高手的完整指南

5分钟精通YOLOv9模型评估&#xff1a;从零基础到实战高手的完整指南 【免费下载链接】yolov9 项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9 你是否曾经面对训练好的YOLOv9模型&#xff0c;却不知道如何客观评价它的真实性能&#xff1f;在目标检测项目中&…

作者头像 李华
网站建设 2026/6/21 15:55:16

基于VUE的企业客户信息管理系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;在市场竞争日益激烈的当下&#xff0c;客户作为企业的核心资源&#xff0c;其信息管理的高效性与精准性对企业发展至关重要。本文阐述了一个基于VUE框架开发的企业客户信息管理系统&#xff0c;详细介绍了系统的需求分析、技术选型、架构设计、功能模块设计及实…

作者头像 李华
网站建设 2026/6/19 9:34:16

ClickShow鼠标点击特效工具使用指南

ClickShow鼠标点击特效工具使用指南 【免费下载链接】ClickShow 鼠标点击特效 项目地址: https://gitcode.com/gh_mirrors/cl/ClickShow 在屏幕录制、教学演示或远程协作过程中&#xff0c;准确展示鼠标操作轨迹和点击位置往往至关重要。ClickShow作为一款专业的鼠标点击…

作者头像 李华
网站建设 2026/6/19 17:30:44

卫浴行业大会资讯:掌握最新动态,引领行业潮流——5大亮点速览

卫浴行业大会资讯&#xff1a;掌握最新动态&#xff0c;引领行业潮流——5大亮点速览引言卫浴行业作为家居装修的重要组成部分&#xff0c;近年来随着消费者需求的不断升级和技术创新的推动&#xff0c;呈现出快速发展的态势。为了更好地把握行业脉搏&#xff0c;众多企业纷纷参…

作者头像 李华