类指针的关系
1.直接用基类指针引用基类对象;
2.直接用派生类指针引用派生类对象;
3.用基类指针引用一个派生类对象;
4.用派生类指针引用一个基类对象。
class A;
class B:public A;
A * p ; // 指向类型 A 的对象的指针
A A_obj ; // 类型 A 的对象
B B_obj ; // 类型 B 的对象
p = & A_obj ;// p 指向类型 A 的对象
p = & B_obj ;// p 指向类型 B 的对象,它是 A 的派生类
p可以通过B_obj 访问所有从A类继承的元素,但是不能用p访问B类自定义的元素(除非用显示类型转换)
注意:不能将一个声明为指向派生类对象的指针指向其基类的对象。派生类指针只有经过强制类型转换之后,才能引用基类对象
虚函数和动态联编
首先,基类指针对函数的操作只能绑定到基类的成员函数
根据赋值兼容,用基类类型的指针指向派生类,就可以通过这个指针来使用类(基类或派生类)的成员函数。若这个函数是普通的成员函数,通过基类类型的指针访问到的只能是基类的同名成员。如果将它设置为虚函数,则可以使用基类类型的指针访问到指针正在指向的派生类的同名函数。
实现动态联编方式的前提
1.声明虚函数
2.派生类***公有***继承基类
3.通过指针与引用来调用虚函数
***关键字 virtual 的成员函数称为虚函数***必须用基类指针调用派生类的不同实现版本
虚函数的重载特性
在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同
注意:
1.构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。
2.析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象。
3.虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数
4.构造函数、内联成员函数、静态成员函数不能是虚函数。 (虚函数不能以内联的方式进行处理)
纯虚函数和抽象类
在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。一个具有纯虚函数的基类称为抽象类如果子类继承基类,派生类没有给出纯虚函数的实现,那么这个派生类也是抽象类
virtual 类型 函数名(参数表)= 0 ;
注意:
shape x ; // error,抽象类不能建立对象
shape *p ; // ok,可以声明抽象类的指针
shape f ( ) ; // error, 抽象类不能作为函数返回类型
void g ( shape ) ; // error, 抽象类不能作为传值参数类型
shape & h ( shape &) ; // ok,可以声明抽象类的引用``
异质链表
把不同类对象统一组织在一个数据结构中,可以定义抽象类指针数组或链表。由于这种表中的具有不同类类型元素(它们都有共同的基类),所以称为“异质表