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

本文探讨了类的继承机制,包括公有、私有和保护继承的区别,以及派生类重写和构造析构函数的规则。接着,解析了多继承和多重继承的概念,以及如何解决它们带来的问题,如虚继承。此外,讲解了static修饰符在成员属性和方法中的用法,以及const关键字用于常量成员和方法的场景。
摘要由CSDN通过智能技术生成

一、类的继承和派生

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值