1.多态性
向不同的对象发送同一个信息,不同的对象在接收时会产生不同的行为(即方法)。在C++中,多态性的表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数。
2.利用虚函数实现动态多态性
所谓虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
声明形式如下,在最左面加一个关键字virtual
virtual void display();
3.使用虚函数的注意事项
(1)只能用virtual声明类的成员函数,把它作为虚函数,而不能将类外的普通函数声明为虚函数。(2)一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。
4.根据什么考虑是否把一个成员函数声明为虚函数?
(1)首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般 应该将它声明为虚函数。(2)如果成员函数在类被继承后功能无须修改,或派生类用不到该函数,则不要把它声明为虚函数。不要仅仅考虑到要作为基类而 把类中的所有成员函数都声明为虚函数。
(3)应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果是通过基类指针或引用去访问的,则应当声明为 虚函数。
(4)有时,在定义虚函数时,并不定义其函数体,即函数体是空的。它的作用只是定义了一个虚函数名,具体功能留给派生类去添加。
5.虚析构函数
如果用new运算符建立了临时对象,若基类中有析构函数,并且定义了一个指向该基类的指针变量。在程序用带指针参数的delete运算符撤销对象时,会发生一个情况:系统会只执行基类的析构函数,而不执行派生类的析构函数。解决此问题的办法是把基类的析构函数声明为虚函数。此时无论指针指的是同一类族中的哪一个类对象,系统都会采用动态关联,调用相应类的析构函数,对该对象进行清理工作。
6.纯虚函数
纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。声明纯虚函数的一般形式为:
virtual 函数类型 函数名(参数表列)=0;
注意:
(1)纯虚函数没有函数体
(2)最后面的“=0”并不表示函数返回值是0,它只起形式上的作用,告诉编译系统“这是纯虚函数”
(3)这是一个声明语句,最后应有分号
7.抽象类
凡是包含纯虚函数的类都是抽象类。虽然抽象类不能定义对象(或者说抽象类不能实例化),但是可以定义指向抽象类数据的指针变量。