(一)继承
派生类对象储存了基类的数据成员(派生类继承了基类的实现)
派生类对象可以使用基类的方法(派生类继承了基类的接口)
派生类需要自己的构造函数
派生类可以根据自己的需要额外添加数据成员和成员函数
构造函数必须给新成员跟继承的成员提供数据
派生类不能访问基类的私有成员,必须通过基类方法进行讨论
派生类构造函数必须使用基类构造函数
创建派生类对象时首先要创建基类对象(成员初始化列表)非构造函数不能使用此方法
派生类构造函数应初始化派生类新增的数据成员
释放对象的方法跟创建对象的方法相反,先执行派生类的析构函数,在执行基类的析构函数
(二)多态继承
在派生类中重新定义基类的方法
派生类的成员可以直接访问基类的保护成员(protected)
使用虚函数
隐式强制向上转换使基类指针或引用可以指向基类对象和派生类对象,要使用动态联编,用虚成员函数满足
编译器对非虚方法使用静态联编,对虚方法是动态联编
构造函数不能是虚函数,析构函数是虚函数,通常应该给基类提供一个虚析构函数
友元不能是虚函数
如果没有virtual关键字,程序根据引用类型和指针类型选择方法,有关键字,根据引用和指针指向的对象类型来选择方法
方法在基类中声明为虚,在派生类中自动为虚函数
小结:如果要在派生类中重新定义基类的方法,应将基类方法声明为虚的,在基类中声明一个虚析构函数也是一种惯例
当基类和派生类都使用动态内存分配,派生类的析构函数,复制构造函数,赋值运算符都必须使用相应的基类方法处理基类元素
对于析构函数是自动完成的,构造函数,是初始化成员列表中调用基类的复制构造函数,复制运算符是通过作用域解析运算符显式调用基类的赋值运算符来完成的。这三不能继承