zoukankan      html  css  js  c++  java
  • 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()函数
    ";
        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()函数
    ";
        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()函数
    ";
        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()函数
    ";
        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++支持运行时的多态性。 
    */
  • 相关阅读:
    Windows python 鼠标键盘监控及控制
    python 执行adb shell 命令
    python Windows提示框
    判断function属于函数或方法
    生成不同时间下的LOG
    pyqt5 QCalendar类中常用的方法
    python字符串大小写转换
    configparser 模块的基本方法
    QGridLayout类中常用的方法
    Day049--jQuery的文档操作和事件介绍
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912632.html
Copyright © 2011-2022 走看看