数去调用基类的析构函数。在派生类中
可以根据需要定义自己的析构函数,用来对派生类中所增加的成员进行清理工作。
多重继承:class D: public A, private B, protected C
派生类构造函数名(总参数表列):基类1构造函数(参数表列),基类2构造函数(参数表列){...}
多重继承引起的二义性问题:两个基类有同名成员、两个基类和派生类三者都有同名成员。
规则:基类的同名成员在派生类中被屏蔽。
虚基类:在继承间接共同基类时只保留一份成员(需要在所有直接派生类中声明虚基类)。
class B: virtual public A{...}
class C:? virtual public A{...}
在最后的派生类中不仅要对直接基类进行初始化,也要对虚基类初始化。
派生类对象可以替代基类对基类对象的引用进行赋值或初始化。
第十二章
静态多态性在编译时决定调用哪个函数,动态多态性在运行时。静态多态性通过函数重载和运算符重载实现,动态多态性通过虚函数实现。
虚函数:用同一个调用形式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。
虚函数声明:virtual void play();
当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同。
通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。
确定调用的具体对象的过程称为关联(binding)。
一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。当基类的析构函数为虚函数时,无论指针指的是同一类族中的哪一个类对象,系统会采用动态关联,调用相应的析构函数,对该对象进行清理工作。
virtual float area( ) const =0;//纯虚函数
纯虚函数没有函数体,只是通知编译系统:在这里声明一个虚函数,留待派生类中定义。
凡是包含纯虚函数的类都是抽象类。