5.4虚函数
5.4.1 虚函数的引入 //例5.19 虚函数的引例#includeusing namespace std;class MyBase{ //声明基类 public: MyBase(int x,int y) //基类的构造函数 { a = x; b = y; } void show() //基类的show方法 { cout<<"调用基类MyBase的show()函数\n"; cout<<"a="< <<","<<"b="<< 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="<<<","<<"b="<<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++支持运行时的多态性。 */