引言:
前面已经写了两篇基础篇笔记,这一篇是继承和派生专题。
前两篇笔记地址如下👇
正文:
1、继承分为单一继承和多重继承
单一继承:派生类仅由一个基类派生
多重继承:派生类由多个基类派生
2、继承方式:公有继承(派生)public、保护继承(派生)protected、私有继承(派生)private
例:
class B public:A
{
......
};
class B protected:A
{
......
};
class B private:A
{
......
};
3、A派生了B=B继承了A
4、不同继承方式下,基类成员的访问权限在派生类中的边变化。(见图)
5、无论何种继承方式,基类的private成员在派生类中均不可直接访问。
6、在有继承的情况下,无论何种继承方式,private成员都无法在派生类中被直接访问。而对于protected成员,无论何种继承方式,在派生类中都可以被直接访问。
7、一般在类的继承体系中,将类的数据成员的访问权限定义为protected较好。
8、多重继承:一个派生类有多个基类。
例:
class Circle:public Point, public Radius
{
......
};
9、若一个类是由多个基类派生出来的,则在定义派生类构造函数时,需要调用基类的构造函数,初始化基类成员。
10、派生类构造函数的执行顺序为:首先依次调用基类构造函数,然后执行派生类自身的构造函数体。
11、析构函数的执行顺序为:首先执行派生类自身的析构函数体,然后调用基类的析构函数。
12、当基类的构造函数没有参数或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至不定义构造函数。
13、当基类含有带参的构造函数时,由于派生类不能继承基类的构造函数或析构函数,派生类必须定义构造函数,以传参给基类构造函数。
14、派生类构造函数的调用顺序:先调用基类的构造函数,再调用对象成员的构造函数,最后调用对象自身的构造函数。
15、派生类析构函数的调用顺序和构造函数相反。
16、基类的构造函数和析构函数都不会被派生类继承。
17、在多重继承中,当在派生类中出现两个以上同名的可直接访问的基类成员时,便出现了二义性(访问冲突)。
18、当把派生类作为基类,继续派生出新的派生类时,这种限定作用域的运算符不能嵌套使用,是错误的。
例:
Point::Sample::Person::show();
19、任一基类在派生类中只能被直接继承一次。
20、支配规则:对同名成员的访问,派生类优先的优先关系。
21、虚基类
1)举个经典的例子:假设定义了一个公共基类A,类B和类C都由类A公有派生,类D由类B和类C公有派生。显然D包含类A的两个拷贝,不仅多占用内存,而且还造成多个拷贝的数据不一致。
因此,为了避免这种情况的出现,我们将基类设置为虚基类,当基类设置为虚基类时,只拷贝一次虚基类。
2)如果派生类继承了多个基类,基类中有虚基类和非虚基类,那么在创建该派生类的对象时,先调用虚基类的构造函数,然后调用非虚基类的构造函数,最后调用派生类的构造函数。若虚基类有多个,则虚基类构造函数的调用顺序取决于它们继承时的说明顺序。
3)定义虚基类的方法:在基类的类名前加关键字virtual。
例:
class A:virtual public B
{
......
};
class A:public virtual B
{
......
};
22、赋值兼容规则:可以将公有派生类的对象赋值给基类对象,反之不允许。
23、赋值兼容与限制归纳:
1)公有继承的派生类对象能赋值给基类对象,私有或保护继承的派生类对象不可以赋值给基类对象。
2)公有继承的派生类对象赋值给基类对象时,系统将派生类对象中从基类继承来的成员赋值给基类对象。
3)不能将基类对象赋值给派生类对象,因为派生类对象是基类对象的扩充,若能赋值,则派生类对象扩充的部分将无值可赋。
4)在公有继承的情况下,可将派生类对象的地址赋给基类的指针变量。
例:
Point *ptr=&line;
5)在公有继承的情况下,派生类对象可初始化基类的引用。
例:
Point &refp=line;
24、相关题目
题目一:定义Person类并派生出Student和Teacher类
题目二:定义Date类和Time类并派生出DateTime类
上面两题是继承和派生的比较好的题目,综合性较强,可以好好研究~