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++支持运行时的多态性。 
*/

 

posted @ 2015-10-26 22:12  XYQ全哥  阅读(286)  评论(0编辑  收藏  举报