zoukankan      html  css  js  c++  java
  • C++中的覆盖与隐藏(详细讲解)

    C++类中覆盖与隐藏一直是一个容易理解出错的地方,接下来我就详细讲解一下区别在何处

    覆盖指的是子类覆盖父类函数(被覆盖),特征是:

    1.分别位于子类和父类中

    2.函数名字与参数都相同

    3.父类的函数是虚函数(virtual)

    隐藏指的是子类隐藏了父类的函数(还存在),具有以下特征:

    子类的函数与父类的名称相同,但是参数不同,父类函数被隐藏

    子类函数与父类函数的名称相同,参数也相同,但是父类函数没有virtual,父类函数被隐藏

      

    class father
    {
    public:
        void show1()
        {
            cout << "father::show1" << endl<< endl;
        }
    
        virtual void show2()
        {
            cout << "father::show2" << endl << endl;
        }
    };
    
    class son:public father
    {
    public:
        void show1()
        {
            cout << "son::show1" << endl<< endl;
        }
    
        virtual void show2()
        {
            cout << "son::show2" << endl << endl;
        }
    };

    int main()
    {
      father f;
      son s;

      father *pf=&s;
      son *ps=&s;

      pf->show1();
      pf->show2();
      
      return 0;
    }

    因为show1是非virtual函数,调用它的对象类型为静态类型即父类(静态联编),所以调用的是父类的对象

    但是show2为virtual函数,调用它的对象类型为动态类型即指针指向的类型(动态联编),所以调用的是子类的类型

    IF 子类的函数与父类的名称相同,但是参数不同

      父类函数被隐藏

    ELSE IF 子类函数与父类函数的名称相同&&参数也相同&&但是父类函数没有virtual

      父类函数被隐藏

    ELSE IF 子类函数与父类函数的名称相同&&参数也相同&&但是父类函数有virtual

      父类函数被覆盖

  • 相关阅读:
    hdu 6085 bitset优化
    hdu 6070 二分答案+线段树
    hdu 6069 区间筛
    hdu 6058 并查集
    CF 835D D. Palindromic characteristics 字符串hash
    (转)Linux整合apache和tomcat构建Web服务器
    iTunes备份文件路径
    mac下Apache添加限速模块mod_bw
    mac显示隐藏文件夹
    Mac OS X下HomeBrew安装卸载
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7748546.html
Copyright © 2011-2022 走看看