据我了解到,压倒一切的是,当你有2职能拥有相同的名称和职能返回的类型(void
, int
, float
等等)和相同的参数编号和类型。
和负载过重是当你有2职能具有相同的名称,但无论是参数编号/种类或功能的返回式应该是不同的。
但是今天当我在舱,我看到的这个幻灯片:
应该不该被超载? 没有压倒一切的? 因为这里返回的类型发生了变化(由 void
要 float
)和fa1()功能在基类没有参数,但在得出类它浮动的参数。
如果这是压倒一切的,为什么?
在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
};
ia1
不过载。 首先,你能不能超载的变量。 所以 ia1
肯定是替代。 它也是一个危险的事情。 在我的公司,我们的编码标准的禁止压倒一切变量名称,在任何情况。 它只是导致混乱。
fa1
虽然-看起来像一个超负荷。 基类 fa1()
没有争论,但是该子类版本需要一个浮动。