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

      父类函数被覆盖

  • 相关阅读:
    docker 清理日志文件
    POJ2182 Lost Cows
    POJ3468
    楼兰图腾
    P2024 [NOI2001]食物链
    POJ1733 Parity game
    洛谷P1196 [NOI2002]银河英雄传说
    洛谷P1955 [NOI2015]程序自动分析
    CF 660 C. Uncle Bogdan and Country Happiness
    CF 660A&B
  • 原文地址:https://www.cnblogs.com/rednodel/p/9299894.html
Copyright © 2011-2022 走看看