虚基类的基本概念

article/2025/10/7 13:10:24

1.虚基类的作用

类B与类C都为类D的基类,而类A为类B与类C的基类,因此类D会继承类B与类C的多份同名成员。如下图所示:
在这里插入图片描述
在引用这些同名成员时,必须在派生类对象后增加直接基类名,以避免产生二义性,如:D d; d.B::display();
在这种继承方式下,会保留多份数据成员的拷贝,不仅占用内存还会增加访问成员时的困难。
C++提供了虚基类使得在继承共同间接基类时只保留一份成员。

2.虚基类的声明

因为类B与类C都继承自类A,因此将类A声明为虚基类,这样类D通过类B与类C间接继承的类A只继承一次,即只保留类A的一份成员。
声明类A为虚基类:
class A
{…};
class B:virtual public A
{…};
class C:virtual public A
{…};
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式声明的。
声明虚基类的一般形式为:
class 派生类名:virtual 继承方式 基类名

3.虚基类的初始化

如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(直接派生或间接派生)中,通过构造函数的初始化表对虚基类进行初始化。
在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类的初始化。
C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略基类的其它派生类(如类B与类C)对虚基类的构造函数的调用,这就保证了虚基类的数据成员不会被多次初始化。
4.虚基类实例代码
Person类:

#ifndef PROJECT5_PERSON_H
#define PROJECT5_PERSON_H#include <iostream>
#include <string>
using namespace std;class Person {
protected:string name;char gender;
public:Person(string n, char g) : name(n), gender(g) {}void display() {cout << "name: " << name << endl;cout << "gender: " << gender << endl;}
};#endif //PROJECT5_PERSON_H

Student类:

#ifndef PROJECT5_STUDENT_H
#define PROJECT5_STUDENT_H#include <string>
#include "Person.h"
using namespace std;class Student : virtual public Person {
protected:double score;
public:Student(string n, char g, double s) : Person(n, g), score(s) {};
};#endif //PROJECT5_STUDENT_H

Teacher类:

#ifndef PROJECT5_TEACHER_H
#define PROJECT5_TEACHER_H#include <string>
#include "Person.h"
using namespace std;class Teacher : virtual public Person {
protected:string title;
public:Teacher(string n, char g, string t) : Person(n, g), title(t) {};
};#endif //PROJECT5_TEACHER_H

Graduate类:

#ifndef PROJECT5_GRADUATE_H
#define PROJECT5_GRADUATE_H#include "Teacher.h"
#include "Student.h"
#include <string>
using namespace std;class Graduate : public Teacher, public Student{
private:double wage;
public:Graduate(string n, char g, double s, string t, double w) : Person(n, g), Student(n, g, s), Teacher(n, g, t), wage(w) {};void display() {Person::display();cout << "score: " << score << endl;cout << "title: " << title << endl;cout << "wages: " << wage << endl;};
};#endif //PROJECT5_GRADUATE_H

main:

#include <iostream>
#include "Graduate.h"
using namespace std;int main() {Graduate grad1("neo",'f',88,"教授",1234.5);grad1.display();return 0;
}

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

相关文章

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

虚基类 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…

单片机PWM舵机控制原理

舵机的控制一般需要一个20ms的时基脉冲&#xff0c;该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例&#xff0c;那么对应的控制关系是这样的&#xff1a; 0.5ms--------------0度&#xff1b; 1.0ms------------45度&#xff1b; 1.5ms---…

STM32 PWM控制舵机——原理、接线、源程序

STM32——PWM 控制舵机 通用定时输出PWM PWM的工作原理PWM的模式 TIM_OCMode_PWM1 &#xff08;边沿对齐模式&#xff09;TIM_OCMode_PWM2&#xff08;中央对齐模式&#xff09; 占空比 舵机 实物图接线舵机工作原理周期TPWM占空比 TIM3 PWM输出 驱动SG90电机 配置过程&#xf…

pwm波控制舵机原理(转)

文章转自&#xff1a;http://www.geek-workshop.com/thread-70-1-1.html 一、关于舵机&#xff1a; 舵机&#xff08;英文叫Servo&#xff09;&#xff1a;它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号&#xff0c;指定输出轴旋转角度。…

pwm信号控制舵机的简单原理

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

SG90舵机的原理和控制方式

前言 做过机器人、智能车或者玩航模的朋友应该对舵机不会陌生&#xff0c;这种舵机也是很常用的。 舵机只是我们通俗的叫法&#xff0c;它的本质是一个伺服电机&#xff0c;也可以叫做位置(角度)伺服驱动器。一般被应用在那些需要控制角度变化的系统中&#xff0c;可以方便的…

舵机控制原理和结构

原文&#xff1a;https://blog.zeruns.tech/index.php/archives/358/ 什么是PWM信号 PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅…

舵机控制原理/舵机内部电路原理

舵机结构 舵机是我们常用到的末端执行器&#xff0c;但是在应用时我们只知道利用一定频率和周期的PWM来控制其摆动一定角度。及控制器给舵机一个周期为20ms的PWM波&#xff0c;高电平时间为0.5ms时对应0&#xff0c;高电平时间为2.5ms时对应180。以上规律适用于大多数180摆角的…

矩阵谱半径与矩阵范数的关系

摘自 程云鹏. 矩阵论(第二版)[M]// 矩阵论&#xff08;第二版&#xff09;. 西北工业大学出版社, 2000. p135~p137

谱半径

矩阵的谱或叫矩阵的谱半径&#xff0c;在特征值估计、广义逆矩阵、数值分析以及数值代数等理论的建树中&#xff0c;都占有极其重要的地位&#xff1b; 矩阵的谱半径为矩阵的特征值的模的最大值。 关于矩阵的谱&#xff08;半径&#xff09;的一个重要性质即是&#xff1a;任意…

【矩阵论笔记】谱半径

定义 例子 谱半径比他的诱导范数都小。 证明 例子 hemite对称矩阵 谱半径什么时候跟诱导范数相等&#xff1f;答曰&#xff1a;Hermite矩阵。