zoukankan      html  css  js  c++  java
  • 重写、重载、隐藏的区别

    重载:指的是同一可访问区被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数。重载不关心函数返回类型。

    class A
    {
    public:
        void test{int i};           //overload
        void test(double i);        //overload
        void test(int i, double j); //overload
        void test(double i, int j); //overload
        int test(int i);            //not overload
    };

    隐藏:是指派生类的函数屏蔽了与其同名的基类函数。注意只要是同名函数,不管参数列表是否相同,基类函数都会被隐藏。

    #include<iostream>
    using namespace std;
    
    class Base
    {
        public:
            void fun(double, int)
            {
                cout << "Base::fun(double, int)" << endl;
            }
    };
    
    class Derive:public Base
    {
        public:
            void fun(int)
            {
                cout << "Derive::fun(int)" << endl;
            }
    };
    
    int main()
    {
        Derive pd;
        pd.fun(1);
        //pd.fun(0.01, 1); //error
    
        Base *fd = &pd;
        fd->fun(1.0, 1);
        //fd->fun(1) //error
        return 0;
    }

    重写(覆盖):是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型都必须同基类中被重写的函数一致。只有函数体(花括号里的内部实现不同),派生类调用时会调用派生类的重写函数,不会调用被重写函数。基类中被重写的函数和派生类中重写的函数必须要用virtual修饰。

    #include<iostream>
    using namespace std;
    
    class Base
    {
        public:
            virtual void fun(int i)
            {
                cout << "Base::fun(int)" << i << endl;
            }
    };
    
    class Derive:public Base
    {
        public:
            virtual void fun(int i)
            {
                cout << "Derive::fun(int)" << i << endl;
            }
    };
    
    int main()
    {
        Base b;
        Base *pb = new Derive();
    
        pb->fun(3);
        return 0;
    
    }

    重写和重载的区别:

    1. 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
    2. 参数区别:重写和被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
    3. virtual区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。

    隐藏和重写,重载的区别:

    1. 与重载范围不同:隐藏函数和被隐藏函数在不同类中。
    2. 参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名要一样;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。
    #include<iostream>
    using namespace std;
    
    class Base
    {
    private:
        /* data */
    public:
        virtual void f(float x)
        {
            cout << "Base::f(float) " << x << endl;
        }
    
        void g(float x)
        {
            cout << "Base::g(float) " << x << endl;
        }
    
        void h(float x)
        {
            cout << "Base::h(float) " << x << endl;       
        }
    };
    
    class Derived : public Base
    {
    public:
        virtual void f(float x)
        {
            cout << "Derived::f(float) " << x << endl;
        }
    
        void g(int x)
        {
            cout << "Derived::g(int) " << x << endl;
        }
    
        void h(float x)
        {
            cout << "Derived::h(float) " << x << endl;       
        }
    };
    
    int main()
    {
        Derived d;
        Base *pb = &d;
        Derived *fd = &d;
    
         //overwrite  
        pb->f(3.14f);   //Derived::f(float) 3.14
        fd->f(3.14f);   //Derived::f(float) 3.14
    
        //overload
        pb->g(3.14f);   //Base::g(float) 3.14
        fd->g(3.14f);   //Derived::g(int) 3
    
        pb->h(3.14f);   //Base::h(float) 3.14
        fd->h(3.14f);   //Derived::h(float) 3.14
    
        return 0;
    }

    (1)函数Derived::f(float)覆盖了Base::f(float)。

    (2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。

    (3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。

    转载:https://www.cnblogs.com/zhangjxblog/p/8723291.html

  • 相关阅读:
    PyCharm小技巧
    How to install torcs package in Debian
    QT4.8.6静态编译
    Debian初识(选择最佳镜像发布站点加入source.list文件)
    Dev-C++ 小问题锦集
    ubuntu 12.04lts 安装mysql ,并通过QT连接
    win7下安装ubuntu14.04lts 双系统
    cmake打印变量值
    驾车常识:小轿车灯光
    汽车点火开关的功能介绍
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/12149920.html
Copyright © 2011-2022 走看看