zoukankan      html  css  js  c++  java
  • C++的重载,覆盖,隐藏

    这三个概念对于初接触C++的人员是个老大难问题,曾经一度以为自己已经完全通了,偶一回头,发现居然又搞混了,再复习一次。

    1、首先将其重载提取出来,重载针对的是一个类中的函数名相同,参数类型不周的情况(返回值不考虑)

    如下代码所示:

    class A{
        void (int a);
        void (float a);
        void (int a, int b);
    };

    2、再谈覆盖,这其实为C++多态性的一种应用,条件最严格:

    子类函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致

    1)不同的范围(分别位于派生类与基类

    2)函数名字相同

    3)参数相同

    4)返回值类型相同

    5)基类函数必须有关键字virtual关键字

    注:派生类虚函数覆盖基类虚函数+隐藏基类中所有其他的重载函数

    3、最后谈隐藏,隐藏为满足前两点(不同的范围,函数名字相同),而又没能同时满足后三点的情况。

    代码示例:

    class Base  
    {  
     
    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(int argc, char* argv[])
    {
     
        Derived  d;   
     
        Base *pb = &d;   
     
        Derived *pd = &d; 
     
     
        // Good : behavior depends solely on type of the object   
     
        pb->f(3.14f); // Derived::f(float) 3.14   
     
        pd->f(3.14f); // Derived::f(float) 3.14  
     
     
        cout<<"****************************************"<<endl;
     
        // Bad : behavior depends on type of the pointer   
     
        pb->g(3.14f); // Base::g(float) 3.14   
     
        pd->g(3.14f); // Derived::g(int) 3        (surprise!)  
     
     
        cout<<"****************************************"<<endl;
        // Bad : behavior depends on type of the pointer   
     
        pb->h(3.14f); // Base::h(float) 3.14      (surprise!)   
     
        pd->h(3.14f); // Derived::h(float) 3.14  
        cout<<"****************************************"<<endl;
    }

    代码说明:

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

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

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

  • 相关阅读:
    行星工单系统部分实现(1)-流程控制
    当初要是看了这篇,React高阶组件早会了
    健壮高效的小程序登录方案
    SQL Case when 的使用
    JS脚本动态给元素/控件添加事件
    VMware虚拟机屏幕大小只有400,800怎么办如何解决
    mysql和mysql jdbc连接器mysql-connector-java对应关系
    mysql中难以理解的sql
    PLSQL计算质数
    java alibaba fastJson 遍历数组json
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2315186.html
Copyright © 2011-2022 走看看