虚基类 的作用

article/2025/10/7 11:20:32

虚基类

  • 需要解决的问题
    • 当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性
  • 虚基类声明
    • 以virtual说明基类继承方式
    • 例:class B1:virtual public B
  • 作用
    • 主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题
    • 为最远的派生类提供唯一的基类成员,而不重复产生多次复制
  • 注意:
    • 在第一级继承时就要将共同基类设计为虚基类。

虚基类举例

#include <iostream>
using namespace std;
class Base0 {
public:int var0;void fun0() { cout << "Member of Base0" << endl; }
};
class Base1: virtual public Base0 {
public: int var1;
};
class Base2: virtual public Base0 {
public: int var2;
};class Derived: public Base1, public Base2 {
//定义派生类Derived 
public: int var;void fun() {cout << "Member of Derived" << endl;}
};int main() {    Derived d;d.var0 = 2; //直接访问虚基类的数据成员d.fun0();     //直接访问虚基类的函数成员return 0;
}

虚基类及其派生类构造函数

  • 建立对象时所指定的类称为最远派生类
  • 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。
  • 整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中为虚基类的构造函数列出参数。如果未列出,则表示调用该虚基类的默认构造函数。
  • 在建立对象时,只有最远派生类的构造函数调用虚基类的构造函数,其他类对虚基类构造函数的调用被忽略。
    #include <iostream>
    using namespace std;class Base0 {   
    public:Base0(int var) : var0(var) { }int var0;void fun0() { cout << "Member of Base0" << endl; }
    };
    class Base1: virtual public Base0 {
    public: Base1(int var) : Base0(var) { }int var1;
    };
    class Base2: virtual public Base0 { 
    public:Base2(int var) : Base0(var) { }int var2;
    };class Derived: public Base1, public Base2 {
    public:Derived(int var) : Base0(var), Base1(var), Base2(var) { }int var;void fun() { cout << "Member of Derived" << endl; }
    };int main() {    //程序主函数Derived d(1);d.var0 = 2; //直接访问虚基类的数据成员d.fun0();   //直接访问虚基类的函数成员return 0;
    }



http://chatgpt.dhexx.cn/article/aHVGPf9x.shtml

相关文章

虚基类的作用

1 概念 首先还是先给出虚继承和虚基类的定义。虚继承&#xff1a;在继承定义中包含了virtual关键字的继承关系&#xff1b; 虚基类&#xff1a;在虚继承体系中的通过virtual继承而来的基类&#xff0c;需要注意的是&#xff1a; CSubClass : public virtual CBase {}; 其中CB…

系统调用:系统调用的实现

7.3.3 系统调用的实现 1. 中断和陷入硬件机构 (1) 什么是中断和陷入。 中断是指CPU对系统发生某事件时的这样一种响应&#xff1a;CPU暂停正在执行的程序&#xff0c;在保留现场后自动地转去执行该事件的中断处理程序&#xff1b;执行完后&#xff0c;再返回到原程序的断点处继…

系统调用、函数调用

1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性&#xff0c;为了达到这个目的&#xff0c; 内核提供一系列具备预定功能的多内核函数&#xff0c;通过一组称为系统调用&#xff08;system call)的接口呈现给…

C++ 虚基类

C 虚基类 概述多重继承的问题虚基类初始化例子 总结 概述 虚基类 (virtual base class) 是用关键字 virtual 声明继承的父类. 多重继承的问题 N 类: class N { public:int a;void display(){cout << "A::a" << a <<endl;} };A 类: class A :…

虚基类

虚基类 意义:假设定义了一个公共基类A。类B和类C都由类A公有派生,类D由类B和类C公有派生。显然D包含类A的两个拷贝,不仅多占用内存,而且还造成多个拷贝的数据不一致。 不定义虚基类的效果如下: class A {public:int x;void SetX(int a) { x = a; }A(int a = 0) { x = a…

【操作系统】系统调用

文章目录 系统调用系统调用举例文件拷贝的系统调用过程应用程序接口系统调用接口C语言系统调用接口Windows和UNIX系统调用示例系统调用与的库函数区别补充说明系统调用 系统调用,System call,提供了操作系统的服务接口。这些系统调用通常以C或C++编写,对某些底层任务可能以…

C++之基类调用自己的虚函数

每个类中存在虚函数时&#xff0c;当构造一个对象时&#xff0c;系统会为对象分配相应的内存空间。但是虚函数表存放在程序的只读数据段中&#xff0c;在实例化对象时&#xff0c;编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable&#xff1b; 下面看一个小例子&#x…

如何调用基类私有的虚函数

直接看代码 #include <iostream> #include <stdio.h> using namespace std;class person { public:virtual void name(){cout<<"A::name"<<endl;}private:virtual void sex(){cout<<"A::sex"<<endl;} };class studen…

详解虚函数的实现过程之虚基类(4)

博客虚函数实现过程3 时提到过虚基类&#xff0c;这里呢&#xff0c;我们来详细讲述一下&#xff1a; 当我们在虚函数的声明结尾处添加“0”&#xff0c;这种虚函数就被称为纯虚函数。 它好似一个没有实现只有声明的函数&#xff0c;它的存在就是为了让类具有抽象类的功能&…

虚基类的基本概念

1.虚基类的作用 类B与类C都为类D的基类&#xff0c;而类A为类B与类C的基类&#xff0c;因此类D会继承类B与类C的多份同名成员。如下图所示&#xff1a; 在引用这些同名成员时&#xff0c;必须在派生类对象后增加直接基类名&#xff0c;以避免产生二义性&#xff0c;如&#x…

【虚基类、虚函数及应用】

虚基类 1.虚基类存在的意义 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处&#xff0c;这个公共的基类就会产生多个实例(或多个副本)&#xff0c;若只想保存这个基类的一个实例&#xff0c;可以将这个公共基类说明为虚基类。 在继承中产生歧义的原因有可能是…

虚函数的调用机理

C中&#xff0c;必然会接触到虚函数这个概念&#xff0c;那么&#xff0c;会不会对虚函数的内部机理产生疑问呢&#xff1f;而这里&#xff0c;就是对其的简单的研究&#xff08;本人水平有限(&#xff61;•́︿•̀&#xff61;) &#xff09; 首先&#xff0c;先来简单介绍…

系统调用

程序接口是 OS 专门为用户程序设置的&#xff0c;也是用户程序取得 OS 服务的唯一途径。程序接口通常是由各种类型的系统调用所组成的&#xff0c;因而&#xff0c;也可以说&#xff0c;系统调用提供了用户程序和操作系统之间的接口&#xff0c;应用程序通过系统调用实现其与 O…

舵机内部结及工作原理浅析

一、舵机实物图 就像上面这张照片&#xff0c;相信大家都不会陌生&#xff0c;我们常见到的舵机就是这个模样&#xff0c;一般是塑料外壳&#xff0c;当然很少见的也有金属外壳的舵机&#xff0c;因为涉及到控制信号&#xff0c;所以一般有三条引出线。 像上图所示的样子&#…

舵机控制原理详解

控制信号由接收机的通道进入信号调制芯片&#xff0c;获得直流偏置电压。它内部有一个基准电路&#xff0c;产生周期为20ms&#xff0c;宽度为1.5ms的基准信号&#xff0c;将获得的直流偏置电压与电位器的电压比较&#xff0c;获得电压差输出。最后&#xff0c;电压差的正负输出…

PWM驱动舵机原理、SG90、舵机控制

舵机自控系统 自控制电路板接收来自信号线的控制信号&#xff0c;控制电机转动&#xff0c;电机带动一系列齿轮组&#xff0c;减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的&#xff0c;舵盘转动的同时&#xff0c;带动位置反馈电位计&#xff0c;电位计将输出…

舵机的原理和控制

舵机的原理和控制控制信号由接收机的通道进入信号调制芯片&#xff0c;获得直流偏置电压。它内部有一个基准电路&#xff0c;产生周期为20ms&#xff0c;宽度为1.5ms的基准信号&#xff0c;将获得的直流偏置电压与电位器的电压比较&#xff0c;获得电压差输出。最后&#xff0c…

小白入门STM32(2)---控制SG90舵机---基础工作原理详解

文章目录 序言一、基础理论1.1 舵机控制原理--PWM习题 1.2 定时器1.2.1 基础定时器时钟装置循环计数器 1.2.2 比较定时器习题 二、实战上手2.1 设置定时器和单片机接线习题 2.2 代码 三、习题答案 序言 本人一枚软件编程人员&#xff0c;有一定C语言基础&#xff0c;目前自学S…

舵机的控制

舵机是一种位置「角度」伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具、航模、机器人中已经得到普遍使用。舵机是一种俗称&#xff0c;其实是一种伺服马达。本篇通过官方驱动库来实现舵机控制。 一. 舵机介绍 1、结构组成 舵机…

51单片机SG90舵机控制原理

舵机三根线的接法:黄线接信号线&#xff0c;红线接vcc&#xff0c;褐色线接GND 舵机控制原理:通过控制PWM来控制舵机转动的角度&#xff0c;关于PWM的知识可以去智能小车专栏进行学习&#xff0c;转动周期设置为20ms&#xff0c;控制高电平的时间来进行舵机转动的角度。 对于1…