C/C++八股文知识积累2-封装、继承、多态

C++封装、继承、多态知识详解

目录

封装

继承

多态

访问权限

语法和定义

继承时的访问权限

默认访问权限

构造函数和析构函数继承时的默认调用和调用顺序

构造函数

析构函数

虚函数

定义

虚函数的实现原理

重写(覆盖)和重定义(隐藏)的区别

动态多态的使用

纯虚函数和抽象类

定义

虚析构和纯虚析构

友元

全局函数做友元

类做友元

成员函数做友元


C语言是面向过程的语言,C++面向对象,和所有面向对象的语言一样(JAVA、Python等)有着封装、继承、多态的性质。

封装

封装字如其名,就是把所有的数据和处理过程封装在一起,用类(class)来定义,之后只能通过接口来访问,使类成为一个能隐藏自身细节,功能独立的模块,降低各个模块之间的耦合性。

意义:保护类中成员,防止代码或数据在无意识中被破坏,不允许类外成员直接访问或修改类中成员,只能通过提供的公共结构去访问,提高了类中成员的数据安全性。

继承

子类继承父类的特征和行为,复用基类所有的成员变量和成员函数,具有从基类复制而来的所有成员变量和成员函数(基类私有成员可被继承,但不可被访问)。其中构造函数、析构函数、友元函数、静态成员变量、静态成员函数(构造函数和析构函数属于类初始化和清理的函数,派生类有属于自己的构造函数和析构函数,无法继承,但每次需要先调用基类的构造函数初始化对象中基类的部分再调用派生类的构造函数初始化派生类的部分,析构函数相反;友元函数属于类授予特定函数和类的特权使其可以访问其私有属性和方法,如果继承则会打破封装原则,每个类应该显性控制友元的授权,不可继承;静态成员变量和静态成员函数都属于类级别,和对象无关,所有实例共享。通过类名作用域使用,继承会破环这种明确性;注意不能被继承不等同于不能使用和访问,基类的构造函数和析构函数派生类都可以使用,友元函数、静态成员都只能用父类作用域去访问。)都不能被继承。基类中的访问权限只能决定派生类能否访问他们,增强了代码耦合性,当父类中的虚函数或者类本身被final字段修饰时,不可被继承或者重写。意义:基类的代码可以被派生类复用,提高了软件复用的效率,大大缩短了软件开发的周期。

多态

不同派生类的对象对同一消息做出不同响应,基类的指针可以绑定到不同的派生类对象上,这使得基类的指针可以呈现不同的表现形式。意义:对已存在的代码具有可替代性,对代码具有可扩充性,新增子类不会影响已存在类的各种性质,在程序中体现了灵活多变的操作,提高了使用效率,简化了对应用代码的编写和修改过程。

访问权限

语法和定义

在类中共有三种访问权限:

  1. public:公共权限,类内类外皆可访问。
  2. protected:保护权限,类内可以访问,类外不可以访问,子类可以访问。
  3. private:私有权限,只有类内可以访问。

具体使用方法在类内使用访问权限修饰符加":",可修饰之后的成员变量和成员函数,直至遇到下一个访问权限修饰符或类结束为止。如下:

class Person
{
public:
	int geta()
	{
		return a;
	}
	void seta(int x)
	{
		this->a=x;
	}	
	
private:
	int a;
};

继承时的访问权限

继承语法如下:class 派生类:继承方式 基类

这里的继承方式是指访问权限修饰符,关于继承方式有以下规则:

  1. 继承方式为public,则基类中修饰符为public和protected的成员变量和函数在派生类中维持不变。
  2. 继承方式为protected,则基类中修饰符为public和protected的成员变量和函数在派生类中都转变为protected。
  3. 继承方式为private,则基类中修饰符为public和protected的成员变量和函数在派生类中都转变为private。

基类中private修饰的成员变量和成员函数,无论哪种继承方式派生类都无法访问。

可以发现继承方式实质上决定的是基类的成员变量和成员函数在派生类中的访问权限问题,给了派生类修改基类的成员变量和成员函数访问权限的机会。

继承时的访问权限可以当作派生类给继承过来的数据和方法一个权限上限,具体权限要和基类的权限和继承方式取min。

默认访问权限

C++中定义类和对象有class和struct两种类型,两者的区别在于默认访问权限不同

class默认访问权限为private,默认继承方式也是private,同时可以用作模板参数定义,是纯C++特性,常用于封装复杂逻辑,面向对象编程。

struct默认访问权限为public,默认继承方式也是public,不可用于模板参数定义,由于历史问题(C++是由C扩展而来),主要目的是完全兼容C语言的struct,常用于简单的数据聚合。

构造函数和析构函数继承时的默认调用和调用顺序

先形成一个正确的理解,就是派生类对象在内存中包含基类的子对象,并非复制基类的成员到派生类中。基类成员在基类对象中,派生类成员在派生类对象中,整个对象时一个连续的内存块,包含基类对象和派生类对象,访问权限(基类中的访问权限和继承方式共同决定)是控制派生类能否访问基类对象中的基类成员。所以可以大致理解为派生类中的基类子对象都需要回到基类中去初始化和销毁(这个时候不需要关注是否能访问到)。

六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值