C++:类继承|| 类继承的定义访问控制protected类继承的构造函数
Posted 赵同学的代码时间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:类继承|| 类继承的定义访问控制protected类继承的构造函数相关的知识,希望对你有一定的参考价值。
C++代码可重用的性质在开发大型项目时提供了很大的便利,由于重复使用的代码已经经过测试,重用代码相较于新写代码有助于避免在程序中引入错误,且通过代码重用,可以将整个工程板块化,使我们的注意力更集中于整体逻辑之上而非细枝末节。
类继承是代码重用特性的重要体现。
类继承
类继承可以完成以下工作:
Ⅰ可以在已有类的基础上添加功能。
在继承了一个类后,可以给派生类继续新增方法函数,增加原有基类的功能。
Ⅱ可以给类添加数据。
继承了一个类后,可以增加基类中没有的数据成员。
Ⅲ可以修改类方法的行为。
通过函数的重名书写,可以修改原来的类方法。
其实通过源代码复制粘贴,完全可以实现类继承的功能,但是通过类继承,我们可以无需访问源代码派生新类,源代码可以实现不公开。
定义一个派生类的语法
class 派生类名: 继承方式1 基类名1,(继承方式2, 基类名2...)
{};
❗注意❗
① 继承方式有三种,对应于三个关键字:public、private、protected;其影响主要体现在访问权限上。
② 派生类可以继承不止一个类,需要为每一个类确定其继承方式。
③ 派生类继承了基类的实现(数据成员)与接口(方法)。
派生类的访问权限
对于三种派生方式,派生类对基类的访问权限都是相同的,不同的继承方式主要体现在对象调用函数时(对内)。
protected成员具有对内封闭对外可继承的特点。
派生类继承了基类中除了构造函数以外的所有功能,但基类的private成员在派生类中只能通过接口访问。
构造函数
在创建派生类对象前,程序首先创建基类对象。从概念上说,意味着基类对象先派生类一步创建,因此,派生类的构造函数必须使用基类构造函数,当然,倘若没有使用,编译器将调用默认构造函数完成基类函数的构造。
//派生类构造函数
派生类名:派生类名(参数列表 参a, 参b, 参c...):基类名(a, b, c)!!不加类型名
{...}
eg.
Overdraft: Overdraft(const char* s, long an, double bal, double m, double r) : BandAccount(s, an, bal)
{...}
如果A是B的派生类,不加构造函数,相当于调用默认构造函数
A:A(参数列表) === A:A(参数列表):B()
构造函数的冒号后面,不一定是构造函数,他还可以运用是成员初始化列表语法。
RatedPlayer :: RatedPlayer(unsigned int r, const TableTennisPlayer & tp) : TableTennisPlayer(tp)
{
rating = r;
}
等价于
RatedPlayer :: RatedPlayer(unsigned int r, const TableTennisPlayer & tp) : TableTennisPlayer(tp), rating(r)
{
}
首先,对类的构造函数而言,调用了一个隐式构造函数
其次,对数据成员rating进行了成员初始化
总结:派生类构造要点
首先创建基类对象
通过初始化成员列表将参数传递给基类的构造函数
新增的派生类数据成员也应初始化
派生类对象的生命周期结束时,先调用派生类析构函数,再调用基类析构函数(栈型)
要使用派生类,程序必须要能访问到基类声明
派生类和基类之间的特殊关系
派生类对象可以使用基类的方法(非private)
基类指针可以在不进行显式类型转换的情况下指向派生类对象
❗C++这里允许指针类型和被指向对象的类型不匹配
❗使用基类的指针可以作用于指针对象或派生类对象
基类引用可以在不进行显式类型转换的情况下引用派生类对象
助记:基类的东西都在派生类里有了,用派生类可以自动代替一个基类
void Show(const TableTennisPlayer &rt)
{
using std::cout;
cout << "Name: ";
rt.Name();
cout << "\nTable: ";
if (rt.HasTable())
cout << "yes" << std::endl;
else cout << "no" << std::endl;
}
假设有以上show函数,它参数列表中的引用可以指向基类或派生类对象。
//甚至,你可以用一个基类对象去初始化一个派生类对象
TableTennisPlayer olaf2(olaf1)//olaf1是一个派生类对象
类定义中无需定义上述函数,因为存在隐式复制构造函数:
TableTennisPlayer::TableTennisPlayer(const TableTennisPlayer &);
所用引用的地方换为派生类对象,就实现了使用派生类初始化基类的效果。
总结:大(派生类)可以代小(基类)。
以上是关于C++:类继承|| 类继承的定义访问控制protected类继承的构造函数的主要内容,如果未能解决你的问题,请参考以下文章