类的继承、多继承和多重继承、static和constant的用法(C++三)

类的继承、多继承和多重继承、static和constant的用法(C++三),第1张

类的继承、多继承和多重继承、static和constant的用法 一、类的继承和派生1. 继承的作用2. 语法规则3.继承以后,派生类究竟可以使用父类的哪些成员4.派生类重写(复写)父类的同名方法5.派生类的大小6.继承以后构造函数和析构函数的调用规则 二、多继承和多重继承1.多继承(1)概念(2)语法格式(3)多继承中构造函数和析构函数的调用规则 2. 多重继承(1)多重继承遇到的问题(2)解决两个问题的方法 -> 虚继承 三、static的用法1.修饰成员属性2.修饰成员方法(1)特点(2)实际用途 四、const的用法1.const修饰成员变量 (常成员)2.const修饰成员方法3.const修饰对象(常对象)

一、类的继承和派生 1. 继承的作用

为了扩展原来类的功能,提高代码的复用性

例:
People 人; 讲话, 吃饭
Robot 机器人对象; 飞,跑

2. 语法规则

A继承了B,A被称为派生类(子类), B被称为A的基类(父类)

class  派生类名字:public 基类名字  //公有继承
class  派生类名字:private 基类名字  //私有继承
class  派生类名字:protected 基类名字  //保护继承
{

} 
3.继承以后,派生类究竟可以使用父类的哪些成员

第一种:派生类公有继承父类

父类publicprivateprotected
派生类(类的外面)yesnono
派生类(类的内部)yesnoyes

第二种:派生类私有继承父类

父类publicprivateprotected
派生类(类的外面)nonono
派生类(类的内部)yesnoyes

第三种:派生类保护继承父类

父类publicprivateprotected
派生类(类的外面)nonono
派生类(类的内部)yesnoyes
4.派生类重写(复写)父类的同名方法

在派生类中从写基类中的同名方法

派生类名.方法名()//调用派生类中重写的同名方法
派生类名.基类名::方法名()//调用基类中的同名方法

例:

Dog dog;
dog.eat();   //调用子类自己的eat方法
dog.Animal::eat();  //我想调用父类的eat()方法
5.派生类的大小

无论哪种继承方式: 父类所有成员属性+子类自己的成员属性总和

依旧要满足字节对齐

6.继承以后构造函数和析构函数的调用规则

构造函数:先构造父类(无论何种情况,默认都是调用父类的无参构造函数),然后再构造子类

如果程序员想要指定调用父类的特定构造函数 -> 可以的

Dog(int newnum,string newstr):Animal(newnum,newstr)//指定要调用父类Animal(newnum,newstr)版本的构造函数
{
		    cout<<"子类有参构造"<<endl;
}

析构函数:先析构子类,然后再析构父类

二、多继承和多重继承 1.多继承 (1)概念

一个类继承了多个类就叫做多继承

(2)语法格式
class  A:public B,public C
{
	代码
};
(3)多继承中构造函数和析构函数的调用规则

构造函数:从左到右依次调用各个父类的构造

析构函数: 从右到左依次调用各个父类的析构

2. 多重继承

B和C继承A,然后D继承了B和C(参见图示比较形象)

(1)多重继承遇到的问题

问题一: 创建D类对象的时候,A会被构造多次(浪费了存储空间)

问题二: 二义性,通过D去调用A里面的方法有两条途径(一条通过B调用,还有一条通过C调用)

(2)解决两个问题的方法 -> 虚继承

虚继承解决

由于B已经构建过一次A的副本,在构建C的时候编译器会去检查区域种A存不存在,存在就不再重复构建A了

语法格式

class 派生类名 : virtual 基类名
class B:virtual public  A    //A称作B的虚基类
class C:virtual public  A
三、static的用法 1.修饰成员属性

特点:

①初始化必须写在类的外面直接初始化

②static修饰的成员属性是所有该类对象共享的(实际开发往往用来在多个对象之间传递数据)

③static修饰的成员属性优先于类的对象而存在(对象还没有创建(栈,堆),static修饰的成员属性已经存在了(原因是它存储静态存储区))

2.修饰成员方法 (1)特点

①static修饰的成员方法,可以通过类名直接调用(不需要新建对象),节约空间,方便

②static修饰的成员方法,它里面只能使用static修饰的属性,其他非静态成员不能使用

③static修饰的成员方法中不能使用this指针,因为static修饰的成员优先于对象存在,对象还没有,方法已经在静态存储区中存放了

(2)实际用途

在实际开发中,一个类如果是作为工具类来使用,它里面的方法就全部定义成static修饰

工具类:这个类提供了大量的方法给程序员去使用

class  PID  // 平衡控制算法
{
	public:
	static void 控制无人机转弯()
	{
	
	}
	static void 控制无人机平衡()
	{
	
	}
};
四、const的用法

c++的语法随着时代在发展:C++11/C++14/C++17

g++ const修饰成员属性.cpp   -std=c++11  //告诉编译器,依照C++11特性去编译我的程序

g++  -v  //查看编译器的版本
1.const修饰成员变量 (常成员)

特点

const修饰的成员变量只能在构造函数的参数列表中的初始化

一旦初始化完毕,不能用任何函数去修改了

2.const修饰成员方法

特点

表示这个成员方法不可以修改任何成员属性的值(可以使用,不能修改)

void show()  const//注意const写在函数的后面
3.const修饰对象(常对象)

特点

只能使用类中const修饰的成员方法

const Animal  a;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/940583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存