• 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++支持运行时的多态性。 
    */
  • 相关阅读:
    git
    RT-Thread 4.0 + STM32F407 学习笔记1
    C#串口通信及数据表格存储
    NRF52832初步使用
    ubuntu终端下快捷键之--字体放大缩小
    微信公众号开发被动回复用户消息,回复内容Content使用了" "换行符还是没有换行
    python2018年秋季调研
    python图像处理模块Pillow--Image模块
    linux查看文件命令tail的使用
    使用xadmin更新数据时,报错expected string or bytes-like object
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912632.html
Copyright © 2020-2023  润新知