C++过载vs压倒一切在继承

0

的问题

据我了解到,压倒一切的是,当你有2职能拥有相同的名称和职能返回的类型(void, int, float等等)和相同的参数编号和类型。

和负载过重是当你有2职能具有相同的名称,但无论是参数编号/种类或功能的返回式应该是不同的。

但是今天当我在舱,我看到的这个幻灯片:

enter image description here 应该不该被超载? 没有压倒一切的? 因为这里返回的类型发生了变化(由 voidfloat)和fa1()功能在基类没有参数,但在得出类它浮动的参数。

如果这是压倒一切的,为什么?

c++ inheritance oop overloading
2021-11-23 22:01:04
2

最好的答案

2

在C++、任何方法的一个衍生出类的唯一替代方法的基类,如果他们的声明相匹配(I说,"匹配"但是我不知道正式语)。 也就是说,所有的参数必须具有相同的类型,和 const 资格 this 必须是相同的。 如果有什么不匹配的方法,该方法中得出类 隐藏 的所有方法都有相同的名称,而不是重写。 这是什么是"错误"在你的照片,试图告诉你的。 所以 // overrides 在一个评论中的那张照片是不正确和误导性的。

是的,很多C++的教师实际上不理解这些有些模糊的详细信息。

顺便说一句此外,如果要复盖的方法,该方法在您的基类应该 virtual;否则,多态性不会的工作。 如果这不是 virtual我们也说得出类方法 隐藏 的基类方法。 然而,这里的一部分关于 隐藏 几乎已经没有意义;这学期真的想要表达的是你不是重写。

此外, 重载 ,如你所注意到,存在几种方法的名称相同,但不同的人签名。 他们都应该存在的源类是有用的-如果得出类只有一个方法 fa1和其他的 fa1 在基,他们将被隐藏。 然而,没有语法糖"副本"所有 fa1 从基于衍生的,禁止所有 躲在 语义:

class A
{
public:
    void fa1();
    void fa1(int);
};

class B: public A
{
public:
    using A::fa1;
    void fa1(int, int);
};

...
B b;
b.fa1(); // calls A::fa1()
b.fa1(4); // calls A::fa1(int)
b.fa1(4, 8); // calls B::fa1(int, int)

一部分关于隐藏很少,如果有的话,是有用的。 当压倒一切的,你应该告诉这个编译器使用的 override 关键词。 编译器然后会检查你的代码作为你的目的。

class A
{
public:
    virtual void fa1(int) {}
    void fa2(int) {}
};

class B: public A
{
public:
    void fa1(int) override {} // OK
    void fa1() override {} // ERROR: doesn't really override - different signature
    void fa2(int) override {} // ERROR: doesn't really override - not virtual in base
};
2021-11-23 23:16:52

很好的答案,但一个细节:一个功能衍生出类从来没有复盖的非虚拟的功能在基类,即使参数类型,cv-限定词,并ref-限定都是完全一样的。 "复盖"能仅适用于当基本功能是虚拟的。
aschepler
0

ia1 不过载。 首先,你能不能超载的变量。 所以 ia1 肯定是替代。 它也是一个危险的事情。 在我的公司,我们的编码标准的禁止压倒一切变量名称,在任何情况。 它只是导致混乱。

fa1 虽然-看起来像一个超负荷。 基类 fa1() 没有争论,但是该子类版本需要一个浮动。

2021-11-23 22:57:18

"ia1绝对是一个复盖"-不,你不能"替代"或"超负荷"变量。 正确术语是"影子"。
Eugene

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................