C++类继承

C++之继承 继承的概念及定义 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。 这就比如我们设计一个学生管理系统,学校中有老师,学生,工作人员等,我们要记录他们的信息比如学生有电话,姓名,地址,学号等这些信息。 class Student { str 阅读详情

1、类继承(派生)

使用继承的场景:
1)如果新创建的类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承
2)当需要创建多个类时,如果它们拥有很多相似的成员变量或成员函数,可以将这些类共同的成员提取出来,定义为基类,然后从基类继承

class father{
}
class son:public father{  //public 继承方式
}
  • 类成员的访问权限由高到低依次为: public -> protected -> private,public成员在类外可以访问,private成员只能在类的成员函数中访问。
  • 如果不考虑继承关系,protected成员和private成员一样,类外不能访问。但是,当存在继承关系时,protected和private就不一样了。基类中的protected成员可以在派生类中访问,而基类中的private成员不能在派生类中访问
  • 继承方式有三种: public(公有的)、protected(受保护的)和private(私有的)。一般就选择public
- 在派生类中,可以通过基类的公有成员函数间接访问基类的私有成员 - 使用 `using`关键字可以改变基类public、protected成员在派生类中的权限
class A{
public:
	int m_a=10;
protected:
	int m_b=20;
privated:
	int m_c=30;
}
class B:public A{
public:
	using A::m_b;
privated:
	using A::m_a;
}

2、类的对象模型

1)创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数
2)销毁派生类对象时,先调用派生类的析构函数,再调用基类的析构函数
3)创建派生类对象时只会申请一次内存(大小是基类+派生类占用的内存空间之和),派生类对象包含了基类对象的内存空间,this 指针相同,成员变量地址也相同
4) 创建派生类对象时,先初始化基类对象,再初始化派生类对象。
创建派生类时,申请一块基类+派生类的内存空间,先调用基类的构造函数初始化基类的成员,再调用派生类的构造函数初始化派生类的成员
5)C++中,不同继承方式的访问权限只是语法上处理(派生类无法访问基类的私有成员,但实际通过直接操作内存的方式是可以访问的,比如通过指针)

//基类A 派生类B
B *P=new B;
*((int*)P+2)=30;//修改私有成员
delete P;

3、如何构造基类

class A{
public:
	int m_a;
private:
	int m_b;
punlic:
	A():m_a(0),m_b(0); //初始化列表
	{
		cout<<"调用了基类的默认构造函数\n";
	}
	A(int a,int b):m_a(a),m_b(b); //两个参数的构造函数
	{
		cout<<"调用了基类的构造函数A(int a,int b)\n";
	}
	A(const A&a):m_a(a.m_a+1),m_b(a.m_b+1); //基类的拷贝构造函数
	{
		cout<<"调用了基类的拷贝构造函数\n";
	}
	void showA(){count<<"m_a="<<m_a<<"m_b"<<m_b<<endl;}
}
class B:public A
{
public:
	int m_c;
	B():m_c(0),A()   //派生类的默认构造函数
	{
		cout<<"调用派生类的构造函数\n";
	}
	B(int a,int b,int c):A(a,b),m_c(c)   //指明派生类的2参数的构造函数
	{
		cout<<"调用派生类的构造函数\n";
	}
	B(const A&a,int c):A(a),m_c(c)   //指明派生类的拷贝构造函数
		{
		cout<<"调用派生类的构造函数\n";
	}
	void showB(){count<<"m_c="<<m_c<<endl;}
}
int main()
{
	B b1;
	
	B b2(1,2,3);
	
	A a(10,20);
	B b3(a,30);
	
}

原则:基类的成员由基类的构造函数初始化,派生类新增的成员由派生类初始化

拷贝构造函数:用一个存在的对象创建新的对象,不会调用普通的构造函数,而是调用拷贝构造函数。
如果类中没有定义拷贝构造函数,编译器将提供一个拷贝构造函数,将已存在对象的成员变量值赋给
新对象的成员变量。
语法:类名 新对象名(存在的对象名)     类名 新对象名=存在的对象名

拷贝构造函数的语法:类名(const 类名&对象名, 其他参数){.........}
注意:
1、拷贝构造函数权限为public 
2、函数名与类名相同  
3、没有返回值不写void      
4、如果以值传递的方式调用函数,函数的实参为对象,会调用拷贝构造函数

多态

基类指针只能调用基类的成员函数,不能调用派生类的成员函数。如果在基类的成员函数前加 virtual 关键字,把它声明为虚函数,基类指针就可以调用派生类中同名的成员函数,通过派生类中同名的成员函数,就可以访问派生对象的成员变量。
有了虚函数,基类指针指向基类对象时就使用基类的成员函数和数据,指向派生类对象时就使用派生类的成员函数和数据,基类指针表现出了多种形式,这种现象称为多态。 基类引用也可以使用多态。
注意:
1)只需要在基类的函数声明中加上 virtual 关键字,函数定义时不能加。。
2)在派生类中重定义虚函数时,函数特征要相同。
3)当在基类中定义了虚函数时,如果派生类没有重定义该函数,那么将使用基类的虚函数。
4)在派生类中重定义了虚函数的情况下,如果想使用基类的函数,可以加类名和域解析符。指针名->基类名::函数名
5)如果要在派生类中重新定义基类的函数,则将它设置为虚函数;否则,不要设置为虚函数,有两方面的好处:首先效率更高;其次,指出不要重新定义该函数。

多态应用场景

  • 基类的虚函数实现基本功能。
  • 派生类重定义虚函数,扩展功能、提升性能。
    虽然继承也可以实现这种功能,但使用多态可以让编程更简单方便
//根据不同英雄释放不同技能
class hero{
public:
	virtual void skill1(){}
	virtual void skill2(){}
	virtual void skill3(){}
}
class XS:public Hero{
	void skill1(){"XS";}
	void skill2(){"XS";}
	void skill3(){"XS";}
}
class LB:public Hero{
	void skill1(){"LB";}
	void skill2(){"LB";}
	void skill3(){"LB";}
}
class HX:public Hero{
	void skill1(){"HX";}
	void skill2(){"HX";}
	void skill3(){"HX";}
}
int main()
{
	Hero*ptr=nullptr;
	if(id==1){
		ptr=new XS;
	}
	if(id==2){
		ptr=new LB;
	}
	if(id==3){
		ptr=new HX;
	}
	if(prt!=nullptr){
		prt->skill1();
		prt->skill2();
		prt->skill3();
		delte ptr;
	}
}

如果基类没有声明虚函数,内存模型里只有定义的静态变量;如果声明了虚函数,多了一个vfptr虚函数指针,指向vftable虚函数列表,在列表中,存放了基类不同虚函数的地址。派生类和基类内存模型相同,在创建派生类对象后,在虚函数列表中,会用派生类成员函数取代基类成员函数的地址。如果派生类没有重写虚函数,那么在派生类的虚函数列表中还是基类函数的地址。

【Gazebo安装指南】Ubuntu22.04LTS环境下的高效配置与常见问题解决 本文提供了在Ubuntu 22.04 LTS系统上高效安装和配置Gazebo仿真环境的详细指南。针对Gazebo Classic版本,文章对比了通过ROS 2仓库和Ubuntu官方仓库两种主流安装方法,并重点解决了安装过程中常见的软件包定位、模型下载及图形驱动等问题,帮助用户快速搭建稳定的机器人仿真开发环境。 阅读详情

相关推荐

大厂案例:快手AI人才管理系统的架构设计与效果

凌晨两点刷简历的HR、说不清“团队离职率高”原因的业务leader、不知道“该学什么”的员工——这些人力资源场景中的“痛点”,曾是快手高速增长期的真实写照。当员工规模从几千扩张到几万,传统HR系统的“经验驱动”模式彻底失效。2021年,快手启动AI人才管理系统建设,用“数据+算法”重构招聘、培养、绩效、留存全流程。本文将拆解这套系统的架构设计逻辑核心技术实现,以及真实业务效果AI如何让HR从“事务执行者”变成“战略伙伴”?

大模型应用工坊 1710

c++:继承(超详解)

目录一:什么是继承二:继承的格式继承的总结:二:子类和父类(基类和派生类)1.子类和父类的相互赋值:2.同名的成员变量3.同名成员函数三:子类中默认的成员函数1.构造函数2.析构函数3.拷贝构造4.赋值运算符重载 四:单继承和多继承单继承: 多继承:菱形继承解决方法一:解决方法二:单继承和多继承的总结:定义:继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)

qq_62718027的博客 8万+

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

c++ 类的继承

一、类的基本概念 c++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。 一个 B 类继承于A类,或称从类 A 派生类 B。这样的话,类 A 成为基类(父类), 类B成为派生 类(子类)。 派生类中的成员,包含两大部分: 一类是从基类继承过来的,一类是自己增加的成员。 从基类继承过过来的表现其共性,而新增的成员体现了其个性。 继承的优点:减少代码的冗余 提高代码的重用性 二、继承的格式 派生类定义格式: Class 派生类

tranquilllll的博客 8989

ENVI 5.6保姆级教程:高分七号DLC影像从打开到融合的完整流程(附避坑指南)

本文详细介绍了ENVI 5.6处理高分七号DLC影像的完整流程,包括环境准备、数据解压、正射校正、图像融合等关键步骤。特别针对国产卫星数据处理的独特挑战,提供了实用的避坑指南和优化技巧,帮助用户高效完成光学影像的预处理和质量提升。

weixin_33269743的博客 380

Unity 调用安卓内部安装apk

一、申请权限 应用内安装其他应用的权限属于特殊权限,需要在特殊申请。 Uri packageURI = Uri.parse("package:" + mContext.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); startA...

BDDNH的博客 1238

【C++】继承

目录 1. 概念 2. 定义 2.1. 使用格式 2.2. 继承方式与限定修饰符 3. 基类和派生类对象赋值转换 (public继承) 4. 继承中的作用域 5. 子类类的默认成员函数 6. 继承与友元 7. 静态成员 8. 菱形继承和虚继承 8.1 菱形继承 8.2 虚继承(virtual) 8.3 虚继承解决数据冗余和二义性的原理 9. 继承总结、继承与组合 9.1总结 9.2 继承与组合 1. 概念 继承(inheritance)机制是面向对象程序设..

Edward_Asia的博客 9560

GD32主程序跑飞?可能是BOOT0引脚惹的祸(附J-LINK调试实录)

本文针对GD32微控制器程序下载后无法运行的典型问题,深入剖析了BOOT0引脚配置对启动模式的关键影响。通过结合J-LINK调试器与KEIL MDK环境,详细演示了如何从程序跑飞现象(如PC指向0x1FFF Fxxx)定位到硬件层面的BOOT0引脚与VDD短路故障,并提供了系统的硬件排查步骤与设计预防建议。

d6e7f8的博客 701

C++类的继承

C++中类的继承 一、继承基本概念 继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。 当一个类被其他的类继承时,被继承的类称为基类,又称为父类。 继承其他类属性的类称为派生类,又称为子类。 一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上

XiaoZ的博客 2055

关于石墨烯费米能级和偏置电压之间的关系问题

石墨烯费米能级与电压的关系问题

qq_37946542的博客 3514

高性能优化的本质

在很早之前,处理器性能的提升一般是通过减小元器件的尺寸,增加元器件的数量,提高主频来实现,这也是摩尔定律所说的,但是由于功耗的影响,主频不能一直增加。后来,由于英伟达的GPU的并行计算的出现,逐渐打破摩尔定律,人们利用多核,SIMD,SIMT来处理大量相同计算的数据,这极大的提高了效率。计算机的算力得到了巨大的提升,但是并行是困难的,对于有数据依赖的程序来说,处理并行是一件及其困难的事,但对于一些简单的数学库的计算,并行的实现相对简单。

发狂的小花的博客 273

【c++】cpp类的继承

c++类的继承

hutaotaotao的博客 2296

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

【CPP】类与继承

父类,如果当前类的子类是多继承就会影响到子类,将当前类的子类中重复的当前类的父类部分合二为一,所以说虚继承关系到3个具有父子关系的类。发现了吗,平板电脑因为既继承了笔记本电脑,又继承了手机,所以其中包含了两个计算机的特性,这就产生了数据冗余和二义性的问题。在以上的例子中我们称反恐精英为玩家的子类,玩家为反恐精英的父类,反恐精英继承自玩家这个父类。简单来说单继承就是只有一个"继承链"的继承方式,类似于链表,每个类的父节点都是唯一的。标签,所有的底层全都是开放的,导致子类可以很轻松地使用到父类底层的所有东西。

2302_79981653的博客 1428

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

CPP类的继承

CPP语法——类的继承

记录知识点的博客 1059

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++类继承

继承是一种简化代码的手段之一,使代码可以实现复用。它允许在原来类的功能上进行扩展,衍生出新的功能。也可以把多个类的基本信息提取到某个类,减少代码的冗余。其中被继承的类通常叫做父类或基类,继承下来的类叫做子类或派生类。...

dtxew love c++ 4694

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C/C++类的继承

一.类的继承 class Shape{ }; class Circle : public Shape{ }; 语法:class B : public A{} B继承于A,A类是父类,B是派生类(子类) 当 B继承于A时,自动将父类中的所有public 成员继承,无法继承private的 新的修饰符:protected (1)该成员不能被外部访问,如private (2)该成员可以被子类继承,如p...

Lavener_Love的博客 2万+

c++中类的继承

摘要:本文系统介绍了C++继承机制的核心概念与应用。主要内容包括:继承的三种访问控制方式(public/protected/private)及其权限影响;派生类构造与析构的顺序规则及显式调用方法;函数重写(虚函数)与隐藏的区别;多重继承的菱形问题及解决方案;类型转换的安全性问题。文中通过员工管理系统示例演示继承的实际应用,并指出切片问题、私有继承误用等常见陷阱。最后强调合理使用继承对构建可维护代码的重要性,建议在适当时采用组合替代继承。

2401_88413914的博客 2278

c++学习12、类继承

【代码】c++学习12、类继承。

2302_80749943的博客 457

C++什么类不能被继承

C++什么类不能被继承 什么类不能被继承,首先思考派生类继承基类将会发生什么默认操作?派生类在调用自身的构造函数之前需要先调用基类的构造函数。那么我们就让这个不想被别人继承的类的构造函数也无法被派生类构造。现在主要有三种方式阻止类的构造函数被调用,一是,将自身的构造函数与析构函数放在private作用域内;二是,将自身作为一个已存在类的友元类。这两种方式都能阻止派生类的继承(因为自身无法构造函数),第三种,使用C++新特性final。 一、将自身的构造函数与析构函数放在private作用域 当我们声明一个对

qq_34796146的博客 5152

C++中如何使类不能被继承

如何使类不能被继承 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现菱形继承层次结构的一个好办法. 要实现一个不能被继承的类有很多方法. 主要的思路就是使子类不能构造父类的部分,这样子类就没有办法实例化整个子类.这样就限制了子类的继承.

alane1986的专栏 1065

简述C++类继承

总之,C++ 类继承是强大且实用的特性,掌握他的继承方式以及对象模型的底层原理,能有效助力我们代码的复用与扩展。以上就是本文关于C++类继承的简单论述,如有不当,还请多多指教。😸😸😸.

ikkkkkkkl的博客 1445

C++如何使类不能被继承

如何使类不能被继承? 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大 的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现菱形继承层次结构的一个好办法. 要实现一个不能被继承的类有很多方法.    主要的思路就是使子类不能构造父类的部分,这样子类就没有办法实例化整个子类.这样就限制了子类的 继承

IT Dreamer 2017

C++定义不能被继承的类

C++的定义的类要求不能被继承,貌似最简单的想法是将构造函数定义为私有的,但事实上这样并不对,这会引发一个问题,用户如何实例化该类?因为友元关系是不能够被继承的,所以可以考虑友元+私有化构造函数来实现。 现在假设有一个class,叫Base,它不希望被继承,而且再假设有一个辅助类uninherit,Base是辅助类uninherit的友元,而且辅助类uninherit的构造函数是私有的,于是假定

学习笔记 4073

【C++】类的继承

在C++中,类的继承是一种重要的面向对象编程概念,它允许创建一个新类(称为派生类或子类),该类继承了另一个已存在的类(称为基类或父类)的属性和方法。通过继承,派生类可以重用基类的代码,并添加自己的特定功能。菱形继承问题:当一个派生类从两个不同的基类继承,并且这两个基类又继承自同一个基类时,就会出现菱形继承问题。虚继承:当一个派生类从多个基类继承,并且这些基类之间存在继承关系时,可以使用虚继承来避免多次复制相同的基类子对象。在C++中,可以使用多继承来创建一个派生类,它同时从多个基类中继承。

小秀的博客 818
上一篇: C++基础回顾
下一篇: C++智能指针
Geek之路
博客等级 码龄7年 725粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值