1.1注意区分虚函数与虚基类,一个是为了实现动态多态性,一个是在继承间接共同基类时只保留一个成员来减少开销。
1.2虚函数的作用是通过同一个调用形式来调用基类或者派生类中的同名函数。
1.3虚函数的使用方法:
A.在基类用virtual声明成员函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便的被调用。
在类外定义虚函数时,不必加virtual。
B.在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数与类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
当一个成员函数被声明为虚函数后,其派生类中的同名函数自动变成虚函数。虽然virtual可以不加,但是为了让代码更加清晰,建议在每一层加上virtual。
如果在派生类中没有对基类的虚函数重新定义,则派生类简单的继承其直接基类的虚函数。
C.定义一个指向基类对象的指针变量,并使他指向同一类族中的某个对象。
D.通过指针变量调用该虚函数,此时调用的就是该指针变量指向的对象的同名函数。
1.4函数重载是同一层次上的同名函数问题,而虚函数处理是不同派生层次上的同名函数问题,前者是横向重载,后者是纵向重载。但
与重载不同的是:同一类族虚函数的函数首部是相同的,而函数重载的函数首部是不相同的。
1.5一段代码:
#include <iostream>
using namespace std;
class student
{
public:
student(int a,bool s,char* n):age(a),sex(s),name(n){}
virtual void display(){cout << age << " " << sex << " " << name << endl;}
protected:
int age;
bool sex;
char* name;
};
class graduate:public student
{
public:
graduate(int a,bool s,char* n,float w):student(a,s,n),wage(w){}
void display(){cout << age << " " << sex << " " << name << " " << wage << endl;}
protected:
float wage;
};
int main()
{
graduate grad(20,true,"shukai",20);
student *pt=&grad;
pt->display();
return 0;
}