6.继承
针对类的代码复用技术
class Son:public Richfather //(公有继承)
{
}
6.1继承的权限问题
类的访问权限(用类定义对象,对象访问数据)
1.public : 外部访问权限
2.protected: 内部访问权限
3.private: 内部访问权限
继承的权限
1.公有继承(public )
2.保护继承(protected)
3.私有继承(private)
6.2构造析构函数执行顺序
基类构造-->子类构造-->子类析构-->基类析构
父类给子类传参
B(int n=20):A(n)//给A类的构造函数传参
6.3多继承
c++允许多继承
class Son:public Richfather,public Richmother //多继承
{
}
当 多个继承方有相同内容时
s.Richfather::money();//用作用域访问符
s.Richmather::money();
注意菱形继承问题,注意避免冲突,所继承的两个父类都继承自同一个父类,这样两个父类会有同一个变量,难以区分
6.4继承与组合
is -a关系:继承
has -a关系:组合
(1)看有没有基类
(2)反过来确认
1.苹果类 香蕉类 水果类 --is -a继承
苹果是水果,香蕉是水果
2.苹果类 草莓类 午餐类 --has -a组合(不确定)
3.发动机 车架 车轮 变速器 汽车--has-a组合
发动机不是汽车,车轮,车架不是汽车
class Car //组合
{
public: Engine e;
//各个类 Frame f;
Wheel w[4];
Speed s;
};
6.5作业
1.继承的权限
2.为什么要引入protected
3.对时钟类,进行升级,设计新时钟类。在原来的基础上增加年月日,具有原本的功能。
1.
struct默认公有权限,class 默认私有权限
struct A{}; class A{}; class B : A{};//默认私有继承 struct B : A{};//默认公有继承
以派生类的默认权限作为继承权限
内部访问:在类内部定义类函数等操作,访问类的属性或者方法叫做内部访问。 外部访问:在类的外部,比如创建了一个类实例对象,通过点.操作符或者->操作符来访问类数据或方法,叫做外部访问。
在C++中,继承权限与访问权限一样,都有三种:public、protected、private。 在三种访问权限(不牵扯到继承与友元)中,声明为public的属性与方法,内部与外部均可访问到;proteced与private只能在其内部访问。按照保护程度来排序,应为:private>protected>public。
公共权限 public 成员:
类内可以访问,类外可以访问 任何一种继承,子类可以访问父类的公共成员
保护权限 protected 成员:
类内可以访问,类外不可以访问 任何一种继承,子类可以访问父类的保护成员
私有权限 private 成员:
类内可以访问,类外不可以访问。 任何一种继承,子类不可以访问父类的私有成员
使用类成员时,只要清楚是在用什么权限的成员以及是在类内用还是在类外用,就一定不会出错
在继承时,若继承权限的保护程度高于访问权限,那么继承权限会将访问权限覆盖,比如private继承时,基类中public与protected的权限,在子类中均为private访问权限;若低于或者相等,则不变。需要注意的是,继承并不是将属性与方法改一下权限然后全扔到子类里面,而是还加上了父类的访问权限,如父类的private属性方法,是只能在父类内部访问的,无论以何种继承,是无法在子类中直接访问的(但可间接访问)。
2.
C++的最大特点就是封装、继承和多态,封装也就是外界无法直接访问private和protected成员,只给外界留出了public接口,借由public接口来访问private和proteced成员,用以限制外部访问,就好像你只需要一个遥控器就能控制整个空调的开关,温度的升降而不用去管其内部细节。
而protected存在的意义是当我不想向外部暴露某个函数或者成员变量,但是我又想让派生类知道和访问这个成员,就将其用protected标志。
private继承之后的权限都会变成private,无法调用其内的成员变量,成员函数。而protected的保护继承之后的public权限会变为protected,可以从外部访问成员函数,从而间接访问私有成员