C++程序设计---继承和派生

继承: 在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称为子类)。

派生类:

派生类拥有基类的全部成员函数和成员变量,不论是private, protected还是public。
派生类可以对基类进行扩充,添加新的成员变量和成员函数。派生类的使用和基类无关。

tip: 在派生类的成员函数中,不能访问继承自基类的private成员。

派生类对象的内存空间

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。

覆盖

派生类可以有和基类同名同参数表的函数,将会覆盖掉基类中的成员函数而不算是重复定义。比较常见的是,在派生类的覆盖函数中,先调用基类的该函数,再处理自己不同于基类中该函数的部分。

继承关系和复合关系

继承: “”关系。
基类A, B是基类A的派生类。
逻辑上要求:“一个B对象也是一个A对象”。

复合: “”关系。
类C中“有”成员变量K, k是类D的对象,则C和D是复合关系。
一般逻辑上要求: “D对象是C对象的固有属性或者组成部分”。

tips:
1,在一个类中,如果有一个成员变量是其他类的指针,通常称为是“知道”关系。
2, 对于基类/派生类 同名成员,调用基类的public成员时得用 base::__ 来调用。

访问范围说明符

基类的 private成员:可以被下列函数访问
1,基类成员函数
2,基类友员函数

基类的 public成员:可以被下列函数访问
1,基类成员函数
2,基类友员函数
3,派生类成员函数
4,派生类友员函数
5,其它的函数(故用private和public并不能凸显派生类和其他类的区别,引入protected)
基类的 protected成员:可以被下列函数访问
1,基类成员函数
2,基类友员函数
3,派生类的成员函数可以访问当前对象的基类的保护成员

派生类的构造函数

派生类对象 包含 基类对象。
执行派生类构造函数前,首先必须执行基类的构造函数
如果派生类中还包含成员对象,也是用参数表的形式构造。

具体形式:
构造函数名(形参表):基类名(基类构造函数实参表),…,成员对象(实参表),…
{
}

public继承的赋值兼容规则

class base {};
class derived : public base {};
base b; derived d;
在加了public后,有以下几条赋值兼容规则。
1,派生类的对象可以赋值给基类对象。
b = d;(把d里面包含的base对象 赋值到b里去)
2,派生类对象可以初始化基类引用。
base& br = d;
3, 派生类对象的地址可以赋值给基类的指针
base* pb = &d;

tips : 声明派生类时,只需要列出它直接基类,构造时也只考虑直接基类的参数表。