C++:虚函数的引入
5.4虚函数
5.4.1 虚函数的引入
//例5.19 虚函数的引例
#include<iostream> using namespace std; class MyBase{ //声明基类 public: MyBase(int x,int y) //基类的构造函数 { a = x; b = y; } void show() //基类的show方法 { cout<<"调用基类MyBase的show()函数\n"; cout<<"a="<<a<<","<<"b="<<b<<endl; } private: int a,b; }; class MyDerived:public MyBase{ //基类的公有派生类 public: MyDerived(int x,int y,int z):MyBase(x,y) //派生类构造函数 {c=z;} void show() //派生类的show方法 { cout<<"调用派生类MyDerived的show()函数\n"; cout<<"c="<<c<<endl; } /* void print() { cout<<"派生类中自定义的成员函数:"<<endl; } */ private: int c; }; int main() { MyBase mb(50,50),*mp; //定义基类对象mb和对象指针mp MyDerived md(10,20,30); //定义派生类对象md mp = &mb; //对象指针mp指向基类对象mb mp->show(); mp = &md; //对象指针mp指向派生类对象md mp->show(); //mp->print();// error: 'class MyBase' has no member named 'print' return 0; } /* 运行结果是:调用基类MyBase的show()函数 a=50,b=50 调用基类MyBase的show()函数 a=10,b=20 结果发现:基类的对象指针可以指向它的公有派生类的对象,但是当其指向公有派生类对象时, 它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员。
可是,如果将将函数声明为虚函数,就可以访问了。 */
//例5.19 虚函数的引入
using namespace std; class MyBase{ //声明基类 public: MyBase(int x,int y) //基类的构造函数 { a = x; b = y; } virtual void show() //基类的show方法,基类中虚函数 { cout<<"调用基类MyBase的show()函数\n"; cout<<"a="<<a<<","<<"b="<<b<<endl; } private: int a,b; }; class MyDerived:public MyBase{ //基类的公有派生类 public: MyDerived(int x,int y,int z):MyBase(x,y) //派生类构造函数 {c=z;} virtual void show() //派生类的show方法,派生类中虚函数 { cout<<"调用派生类MyDerived的show()函数\n"; cout<<"c="<<c<<endl; } private: int c; }; int main() { MyBase mb(50,50),*mp; //定义基类对象mb和对象指针mp MyDerived md(10,20,30); //定义派生类对象md mp = &mb; //对象指针mp指向基类对象mb mp->show(); mp = &md; //对象指针mp指向派生类对象md mp->show(); return 0; } /* 运行结果: 调用基类MyBase的show()函数 a=50,b=50 调用派生类MyDerived的show()函数 c=30 为什么把基类的中的show函数定义为虚函数时,程序的运行结果就正确了呢?这是因为, 关键字virtiual指示C++编译器,函数调用my->show()要在运行时确定所要调用的函数,即 要对该调用进行联编。因此,程序在运行时根据指针mp所指向的实际对象,调用该对象的 成员函数。 我们把使用同一种调用形式"mp->show()“,调用同一类族中不同类中的虚函数称之为动态 的多态性,即运行时的多态性。可见,C++支持运行时的多态性。 */
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!