zoukankan      html  css  js  c++  java
  • c++重载、覆盖和隐藏

           c++成员函数的重载、覆盖和隐藏很容易混淆,因此我们必须搞清楚这一点。

    1.重载

           重载特点:同一访问区域(同类)、函数名称相同、函数参数不同(不关心返回类型)、virtual关键字可有可无

           代码示例:

    class OverLoad
    {
    public:
        void test() {}
        void test(int i) {}
        void test(float i) {}
        void test(int i, float j) {}
    };

    2.覆盖

            覆盖是指派生类函数覆盖基类函数,特点是:不同访问区域(不同类)、函数名称相同 、参数相同、基类函数必须有virtual关键字

    3.隐藏

           隐藏规则:

          1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。

           2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。

    4.代码示例

    #include <iostream>
    using namespace std;
    
    class OverLoad
    {
    public:
        void test() {}
        void test(int i) {}
        void test(float i) {}
        void test(int i, float j) {}
    };
    
    class Base
    {
    public:
        virtual void A(int i) 
        {
            cout << "Base::A()" << endl;
        }
    
        void B(int i)
        {
            cout << "Base::B()" << endl;
        }
    
        void C(int i)
        {
            cout << "Base::C()" << endl;
        }
    
        void D()
        {
            cout << "Base::D()" << endl;
        }
    };
    
    class Derive : public Base
    {
    public:
        //覆盖父类的A  函数名、参数完全相同,且父类要有virtual,子类virtual可有可无
        virtual void A(int i)
        {
            cout << "Derive::A()" << endl;
        }
        
        //隐藏父类中的B 函数名、参数完全相同,父类无virtual
        void B(int i)
        {
            cout << "Derive::B()" << endl;
        }
    
        //隐藏父类中的C 函数名相同、参数不同,与virtual无关
        void C(char* str)
        {
            cout << "Derive::C()" << endl;
        }
    };
    
    int main()
    {
        Derive* d = new Derive;
        Base* b = d;
        //均调用父类中的A
        d->A(1);
        b->A(2);
        //分别调用自己的B
        d->B(1);
        b->B(1);
        //分别调用自己的C
        d->C("1");
        b->C(1);
        d->D();//未被隐藏可以调用D()
        //d->C(1);由于隐藏了父类中的void C(int i),所以不能再调用
    }

    image

  • 相关阅读:
    cocos2dx环境搭建(android平台)
    转:Android开发实践:Java层与Jni层的数组传递
    转:Linux串口编程入门详解
    Linux串口通信之termios结构体说明
    SQLite3 C语言API入门
    android常用工具记录
    Java中byte与16进制字符串的互相转换
    JNI原理及实现
    Java调用动态库方法说明
    JAVA中使用动态链接库须知
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5599222.html
Copyright © 2011-2022 走看看