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类继承的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

C++ 类的继承一(访问控制)

C++继承

C++之继承详解

C++ 继承

对象的继承访问控制