子类继承基类生成派生类。
继承分为单继承和多继承。
不同的继承方式对与派生类对继承的基类的对象会产生不同的访问关系。
赋值兼容原则:派生类对象可以赋值给基类对象、指针、变量等,反过来不行。
多继承:有多个继承的基类。继承的基类前可以些继承方式,缺省默认为私有继承。
基类对象的构造函数执行顺序与基类的继承顺序一致。
多继承如果不同基类有同名成员,那么可能出现歧义,这就是二义性 。
我们知道,继承就会自动调用基类的构造函数构造出派生类。那这样多继承就可能产生多个中间类。而实际上,我们希望多继承最终就是产生一个派生类,中间也是一个。因此多继承实际上除了第一个继承的基类,其他的都是派生类的”假基类“
多态:
运算符重载:同一个运算符可以适用于不同的数据类型运算操作,实现表面上的相同,其实底层是不同的。
动态绑定是多态的一种:
如果不使用虚函数的形式,那么调用基类的函数和调用派生类的函数,都认为是基类的调用。
这是因为此时,虽然指针指向派生类,但是只能看到派生类继承自基类的Print.
虚函数:实现了 通过 基类的指针或引用 来直接访问 派生类的成员
虚函数的实现机制:
本质是通过对象的this指针访问虚指针VPTR,从而找到虚函数表(虚函数的地址)
友元不属于任何一个类,因此友元没有this指针。只有非静态成员函数才拥有隐含传递this指针
以虚函数作为析构函数时,在派生类释放内存时,会首先调用派生类的析构函数,再调用继承自基类的析构函数。这样释放更彻底。
纯虚函数:本质就是一个函数在基类中并没有实现,只是声明一下我这个函数在派生中是有的。
格式:
泛型:泛型就是将方法的数据类型(type)也作为参数,模板可以定义不同的数据类型参数。
下面Template语句声明类的模板,node<T>定义了这个类模板,然后主函数中实例化了类模板。