(七)继承
2016 6 25
1.概述:一个类A可以继承另一个类B,那么我们称类B为基类(父类),类A为派生类(子类)
2.子类从父类继承了所有成员,除了构造函数、析构函数、赋值运算符重载函数。
3.子类继承父类后,子类的成员分为两部分:1.继承父类的部分(base part)2.子类自己扩展的成员(appdent part)
4.虽然父类的私有成员被子类继承,但子类依然不能直接访问这些私有成员,子类只能通过继承符父类的公有成员函数来访问。
5.子类可以自己实现与父类成员函数原型相同(函数名、参数列表)的成员函数,成为覆盖或重写
6.当通过父类对象调用被覆盖的函数时,父类版本的函数被调用,当通过子类对象调用覆盖父类的函数时,子类版本的函数被调用。
7.protected成员
如果父类里有protected类型成员,在子类中可以直接访问,不需要借助父类的公有函数;但是,protected类型的成员,对外界依然是隐藏的,对外就像private类型一样。
继承方式
子类继承父类后,父类中的private成员在子类中是private成员,父类中的protected成员在子类中可以是private,protected,父类中的public成员在子类中可以是public,protected,private.
子类中被继承的成员访问级别由三种继承说明符决定:
1.private;所有被子类继承的成员在子类中都是private.
2.protected;所有被继承的public成员在子类中都是protected,所有被继承的protected,所有被继承的protected、private成员在子类中访问级别不变。
3.public;所有被继承的成员在子类中访问级别不变。
重点内容
继承的使用
1.两个类之间有自然的继承关系,即一个类是另一个类的特例,如graduatestudent is a student,student is a person.
2.实现代码重用(代码复用),一个类可能需要使用其他类中定义的成员,此时可以定义一个派生类继承自该类,这样我们就不必重复编写代码。
类之间最主要的两种交互关系
a.组合:一个类是另一个 类的成员变量,一个类拥有另一个类,是has-a,有一个的关系
eg:自行车有一个轮子。
b.继承:一个类是另一个类的特例,is-a,是一个的关系。
eg:一个学生是一个人。
继承:一个类可以拥有另一个类的成员,称之为继承。类B继承A,B(子类、派生类) A(父类、基类)
当发生继承,子类继承 拥有父类所有成员,除了构造函数、析构函数、赋值运算符重载
当发生继承:子类的成员分为两部分:1.继承父类的部分(base part)2.子类自己扩展的成员(appdent part)
父类的私有成员子类不能直接访问,必须通过公有成员函数间接访问
子类可以扩展与父类同名的成员函数(覆盖 重写,over write)
当发生覆盖,base.func()->父类函数被调用,derived.dunc()->子类函数被调用
调用被覆盖的父类版本函数:derived.base::func();
笔记:
继承的优点:代码重用。
protected :受保护(多用继承上)
父类中protected成员,在子类中可以直接访问,对外不可以直接进行访问
eg:相对于子类public,相对于父类private
当发生继承,为了子类能够直接访问成员变量,成员变量都写在protected中。
继承方式
子类继承父类后,父类中的private成员在子类中是private成员,父类中的protected成员在子类中可以是private,protected,父类中的public成员在子类中可以是public,protected,private.
子类中被继承的成员访问级别由三种继承说明符决定:
1.private;所有被子类继承的成员在子类中都是private.
2.protected;所有被继承的public成员在子类中都是protected,所有被继承的protected,所有被继承的protected、private成员在子类中访问级别不变。
3.public;所有被继承的成员在子类中访问级别不变。
private继承:对类使用产生影响,对子类或者类以外产生影响
既然这些它都能实现,那它和class还能有什么区别?
最本质的一个区别就是默认的访问控制:
默认的继承访问权限
struct是public的,class是private的。
你可以写如下的代码:
struct A
{
char a;
};
struct B : A
{
char b;
};
这个时候B是public继承A的。
如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。
所以我们在平时写类继承的时候,通常会这样写:
class B : public A
就是为了指明是public继承,而不是用默认的private继承。