C++继承

一.继承的概念和定义

1.继承的概念

在这里插入图片描述
可以把一些类的共性提取出来单独封装成一个类,让这个类作为基类
其他类继承这个类作为派生类

比方说下面这个Student类,Teacher类和Person类:
继承之前:
在这里插入图片描述
继承之后:
在这里插入图片描述
可见继承的确就是类设计层次的复用

2.继承的基本语法

了解了继承的概念之后,下面我们来学习一下继承的基本语法
比方说父类是A,子类是B
那么子类就可以通过在类名后面加上: 继承方式来继承父类

class A
{
   
   ...}
class B : public A
{
   
   ...}

这里的继承方式分为public(公有继承),protected(保护继承),private(私有继承)
继承的父类的成员的属性也分为三种:public(公有成员),protected(保护成员),private(私有成员)
因此经过排列组合就可以组合出这9种情况:
在这里插入图片描述

3.继承的代码演示

下面我们来演示一下,就拿Student,Teacher,Person类为例
在这里插入图片描述
继承成功
在这里插入图片描述

二.基类和派生类对象赋值转换

在这里插入图片描述
在这里插入图片描述
下面我们来演示一下,看看到底能不能赋值转换呢?
在这里插入图片描述
可见,完全可以完成赋值转换

我们都知道,临时变量具有常性,因此对临时变量进行引用的话必须要加const.
而且发生类型转化时就会产生临时变量
就像是这样

double d=1.1;
int& ri=d;//此时没有加const就会报错,因为d是double类型,转换为int类型时会产生临时变量

而我们刚才的时候

//引用赋值
Person& rp = s;

在这里s对象是Student类型,引用赋值给rp对象时并没有任何报错或者报警,说明的确没有产生任何临时变量
也就是说基类和派生类对象进行赋值转换时是不会发生类型转换的

三.继承中的作用域

1.概念

在这里插入图片描述
不过不建议在子类中设计跟父类同名的成员,否则会让代码变得复杂

2.演示

下面我们来演示一下
在这里插入图片描述

3.经典题目

class A
{
   
   
public:
	void fun()
	{
   
   
		cout << "func()" << endl;
	}
};
class B : public A
{
   
   
public:
	void fun(int i)
	{
   
   
		cout << "func(int i)->" << i << endl;
	}
};

请问这两个fun函数是什么关系?
A:两个fun构成函数重载
B:两个fun构成隐藏关系
C:编译时报错
D:运行时报错

注意:函数重载要求在同一作用域
而且只要这两个函数的函数名相同,就会构成隐藏关系
因此答案是B,而不是A

下面这两种调用方法正确吗?

B b;
b.fun();
b.fun(1);

答案是:b.fun();不正确,因为子类的fun和父类的fun构成了隐藏关系
因此按照就近原则会先匹配子类的fun函数,而子类的fun函数要求传入一个参数,因此这种调用方法不正确,
而下面这种调用方法是正确的b.fun(1);

那么我就是想要调用父类的fun函数呢?
指定类域

b.A::fun();

在这里插入图片描述

四.派生类的默认成员函数

在这里插入图片描述
在这里插入图片描述

下面来演示一下

1.编译器默认生成的成员函数

编译器默认生成的成员函数会去调用父类相应的默认成员函数

//基类
class Person
{
   
   
public:
	//构造
	Person(const char* name="root")
		:_name(name)
	{
   
   
		cout << "Person的构造函数调用" << endl;
	}
	//拷贝构造
	Person(const Person& p)
		:_name(p._name)
	{
   
   
		cout << "Person的拷贝构造函数调用" << endl;
	}
	
评论 101
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

program-learner

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

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

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

打赏作者

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

抵扣说明:

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

余额充值