标签:
(2)在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数和类型全部与基类的虚函数相同,并根据派
生类的需要重新定义函数体。
c++规定,当一个成员函数被声明为虚函数后,其派生类的同名函数都自动成为虚函数。因此在派生类重新声明该
虚函数时,可以加virtual,也可以不加,但习惯上一般在每层声明该函数时都加上virtual,使程序更加清晰。
如果再派生类中没有对基类的虚函数重新定义,则派生类简单的继承起基类的虚函数。(3)定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
(4)通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
下面来看一个例子:
#include<iostream> #include<string> using namespace std; class Student { public: Student(int , string, float); void display(); protected: int num; string name; float score; }; Student::Student(int n, string na, float s) { num=n; name=na; score=s; } void Student::display() { cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<endl; } class Graduate:public Student { public: Graduate(int , string , float, float); void display(); private: float pay; }; Graduate::Graduate(int n, string na, float s, float p):Student(n,na,s),pay(p) { } void Graduate::display() { cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay:"<<pay<<endl; } int main() { Student stud1(110,"SDL",99.8); Graduate grad1(120,"CCT",88.9, 250.5); Student *p; p=&stud1; cout<<"student:"<<endl; p->display(); p=&grad1; cout<<"graduate:"<<endl; p->display(); return 0; }输出的结果为:
此时没有将任何函数声明为虚函数,所以在Graduate类中diaplay()函数输出时没有pay的值,以为p指针是Student类的,本身Student不包括pay数据。
但如果我们想输出pay的值,只要把Student类中的display函数声明为虚函数即可,只要把它改为virtual void display()声明为虚函数就行,输出的结果为:
标签:
原文地址:http://blog.csdn.net/tian_123456789/article/details/51345189