16

我知道C++ 中的覆盖是什么。但是,有覆盖吗?如果是这样,那是什么意思?

谢谢。

4

6 回答 6

21

在 C++ 术语中,您有覆盖(与类层次结构中的虚拟方法相关)和重载(与具有相同名称但采用不同参数的函数相关)。您还可以隐藏名称(通过在嵌套声明区域或范围中显式声明相同名称)。

C++ 标准不使用术语“覆盖”,除非是其规范的英文形式(即用新值替换一个值,如在x = 10覆盖 的先前值的赋值中x)。

于 2011-01-19T17:14:06.983 回答
7

您可以覆盖变量,例如int a = 0; a = 42;和文件(打开现有文件进行写入 - 如果您有权限,它将覆盖现有文件内容),如果这就是您的意思。这与覆盖几乎没有关系。您是否正在考虑超载?

于 2011-01-19T17:11:28.670 回答
5

我熟悉的通常区别是覆盖和重载。虚函数被覆盖。当存在同名但不同签名的版本时(这存在于许多语言中),函数会被重载。在 C++ 中,您还可以重载运算符。

AFAIK,覆盖是一个不相关的概念(覆盖变量、文件、缓冲区等),并不特定于 C++ 甚至 OOP 语言。

于 2011-01-19T17:13:32.097 回答
2

覆盖是 OOP 中的“正常事物”:派生类为某些东西提供不同的(即更专业的)实现,覆盖基类,例如,如果 apple 是从水果派生的类,则apple::foo()覆盖。fruit::foo()(不要通过使用不同的参数签名而误认为重载,这会导致完全不同的功能)。

覆盖我知道要完全替换为另一个定义。不是在特定级别上,而是一般用于程序的其余部分。这有时会被使用 javascript,如果一个大框架有一些特殊问题,并且你不想撕开大文件:

<script type="text/javascript" 
    src="some super big framework, often in one big file">
<script type="text/javascript">
  Ext.ux.window.createWin = function() {
     // completely OVERWRITE the implementation 
       (often to 'hotfix' a particular bug)
  }
</script>

但是:我不知道 C++ 中有任何这样的事情,因为同时重新定义函数总是会在编译时导致错误。最多,我可以想象弯曲函数指针,或(重新)定义回调挂钩。

于 2011-11-13T18:28:26.327 回答
0

覆盖意味着在基类中创建一个带有virtual关键字的方法,并且基类允许子类为它自己创建一个相同方法的主体。

覆盖是指没有虚拟关键字的覆盖。

重载意味着使用同一个名称创建具有不同输入参数的多个方法。

样品:

    #include <stdio.h>
    #include <stdlib.h>
    class par_overwrite
    {public:    par_overwrite() {}; ~par_overwrite() {};
        int at() { return 1; };
    };
    class chld_overwrite :public par_overwrite
    {public:    chld_overwrite() {};    ~chld_overwrite() {};
        int at() { return 2; }//overwrite
    };
    void main_overwrite()
    {
        par_overwrite pt;
        int ptat = pt.at();
        chld_overwrite ct;
        int ctat = ct.at();
        printf("ptat:%d,ctat:%d\n",ptat, ctat);  //output : ptat:1,ctat:2
    }
    class par_override
    {public:    par_override() {};  ~par_override() {};
        virtual int ad() { return 3; };
    };
    class chld_override :public par_override
    {public:    chld_override() {}; ~chld_override() {};
        int ad() { return 4; }//override
    };
    void main_override()
    {
        par_override pd;
        int pdad = pd.ad();
        chld_override cd;
        int cdad = cd.ad();
        printf("pdad:%d,cdad:%d\n", pdad, cdad); //output : pdad:3,cdad:4
    }
    class par_override_pure
    {public:    par_override_pure() {}; ~par_override_pure() {};
        virtual int adp()=0;//Pure Virtual Function
    };
    class chld_override_pure :public par_override_pure
    {public:    chld_override_pure() {};    ~chld_override_pure() {};
        int adp() { return 5; }//override from Pure Virtual Function
    };
    void main_override_pure()
    {
        //par_override_pure pdp;//error : Can not create object from abstract class that have (Pure Virtual Function)
        //int pdpad = pdp.ad();//error
        chld_override_pure cdp;
        int cdpadp = cdp.adp();
        printf("cdpadp:%d\n", cdpadp); //output : cdpadp:5
    }
    class overload
    {public:    overload() {}; ~overload() {};
        void method_overload(int prm1) { printf("ol1\t"); }
        void method_overload(int prm1, int prm2) { printf("ol2\t"); }
        void method_overload(int prm1, int prm2, int prm3) { printf("ol3\t"); }
        void method_overload(double prm1) { printf("ol4\t"); }
        void method_overload(double prm1, double prm2) { printf("ol5\t"); }
        void method_overload(double prm1, double prm2, double prm3) { printf("ol6\t"); }
    };
    void main_overload()
    {
        overload ol;
        ol.method_overload(1);
        ol.method_overload(1, 1);
        ol.method_overload(1, 1, 1);
        ol.method_overload(0.1);
        ol.method_overload(0.1, 0.1);
        ol.method_overload(0.1, 0.1, 0.1); // output : ol1     ol2     ol3     ol4     ol5     ol6
    }
    int main()
    {   main_overwrite();
        main_override();
        main_override_pure();
        main_overload();

        getchar();
        return 0;
    }
    /* output:
    ptat:1,ctat:2
    pdad:3,cdad:4
    cdpadp:5
    ol1     ol2     ol3     ol4     ol5     ol6
    */
于 2021-07-17T06:47:53.047 回答
0

C++ 函数覆盖。如果派生类定义了与其基类中定义的相同的函数,则在 C++ 中称为函数覆盖。它用于实现运行时多态性。它使您能够提供其基类已经提供的功能的特定实现。

于 2020-07-02T07:35:52.230 回答