一、基类或父类
派生类或子类
1、继承方式有三种:public private protected
默认的是private

2、派生类对基类成员的访问形式:
(1)内部访问:由派生类中新增加的成员函数对从基类继承来的成员的访问
(2)对象访问:在派生类的外部,通过派生类的对象对从基类继承来的成员的访问



小结:
protected[基类成员内型]——public[派生类继承方式]——protected
public[基类成员内型]——protected[派生类继承方式]——protected
对于基类的私有成员:可以通过基类提供的公有成员函数访问
二、派生类的构造函数和析构函数
1、执行顺序
(1)当创建派生类对象时
基类的构造函数——>派生类的构造函数
(2)当撤消派生类对象时
派生类的析构函数——>基类的析构函数


三、调整基类成员在派生类中的访问属性的其他方法
如果在派生类中定义了与基类成员同名的成员,则派生类成员覆盖了基类的同名成员

问题的提出:
能否使私有继承的派生类的对象访问基类的公有成员或保护成员。
解决方法1 :通过公有成员函数间接访问

解决方法2:使用访问声明

注:
(1)访问声明中只能含不带类型和参数的函数名或变量名。
(2)数据成员也可以使用访问声明
(3)访问声明不能改变类成员在基类中原来的性质

(4)对于基类中的重载函数使用访问声明时要慎重

四、多重继承
当一个派生类具有多个基类时,这种派生方法称为多重派生或多重继承。
易存在二义性
使用成员名限定可以消除二义性,例如:
obj.X∷f();//调用类X的f()
obj.Y∷f();//调用类Y的f()
五、虚基类
为什么要引入虚基类?
如果一个派生类是从多个基类派生出来的,而这些基类又有一个共同的基类,
则在这个派生类中访问这个共同的基类中的成员时,可能会产生二义性。
解决办法2:
为了解决这种二义性,使从不同的路径继承的基类的成员在内存中只拥有一个拷贝,引入了虚基类的概念。[ 如果将公共基类说明为虚基类。那么,对同一个虚基类的构造函数只调用一次(第一次出现的时候调用),这样从不同的路径继承的虚基类的成员在内存中就只拥有一个拷贝]

class 派生类名:继承方式 virtual 基类名
{ … }
或
class 派生类名: virtual 继承方式 基类名
{ … }

六、基类与派生类对象之间的赋值兼容关系
(1) 可以用派生类对象给基类对象赋值。
例如:
Base b; //定义基类Base的对象b
Derived d; //定义公有派生类Derived的对象d
b=d;//对象b中数据成员将具有对象d中对应数据成员的值。

说明:所谓赋值仅仅指对基类的数据成员赋值。
(2) 可以用派生类对象来初始化基类对象的引用。
例如:
Base b; //定义基类Base的对象b
Derived d; //定义基类Base的公有派生类
Base& br=d; //Derived的对象d , 定义基类Base的对象的引用br,并用派生类Derived的对象d对其初始化
(3) 派生类对象的地址可以赋给指向基类对象的指针
例如:
Derived d; //定义基类Base的公有派生类
Base* bp=&d; //Derived的对象d
把派生类对象的地址&d赋值给指向基类的指针bp,也就是说,使指向基类对象的指针bp指向派生类对象d。
(4) 如果函数的形参是基类对象或基类对象的引用,在调用函数时可以用派生类对象作为实参。