C++继承和函数重写

leg*_*s2k 21 c++ inheritance overriding

在C++中,基类的成员函数是否会被其相同名称的派生类函数覆盖,即使它的原型(参数'count,type和constness)不同?我想这是一个愚蠢的问题,因为很多网站都说功能原型应该是相同的.但为什么下面的代码没有编译?我相信这是一个非常简单的继承案例.

#include <iostream>
using std::cout;
using std::endl;

class A {};
class B {};

class X
{
public:
    void spray(A&)
    {
        cout << "Class A" << endl;
    }
};

class Y : public X
{
public:
    void spray(B&)
    {
        cout << "Class B" << endl;
    }
};

int main()
{
    A a;
    B b;
    Y y;

    y.spray(a);
    y.spray(b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会抛出

error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 28

用于描述这一术语的术语是"隐藏",而不是"覆盖".默认情况下,派生类的成员将使具有相同名称的基类的任何成员都不可访问,无论它们是否具有相同的签名.如果要访问基类成员,可以使用using声明将它们拉入派生类.在这种情况下,请将以下内容添加到class Y:

using X::spray;
Run Code Online (Sandbox Code Playgroud)

  • 哇抱歉,我的坏,它仍然只看到Y的喷雾(漂浮),当我做y.spray(1); 它类型将int转换为隐式浮动. (2认同)
  • 这是其中一个值得提出自己特殊问题的答案,这些问题采用大量搜索粉末制作,以便人们可以更好地找到它. (2认同)

Ale*_*tov 10

这就是所谓的"隐藏":Y::spray隐藏X::spray.添加using指令:

class Y : public X
{
public:
   using X::spray;
   // ...
};
Run Code Online (Sandbox Code Playgroud)


APr*_*mer 5

类是范围,类范围嵌套在其父级中.您与其他嵌套作用域(名称空间,块)具有完全相同的行为.

会发生什么事情,当名称查找搜索名称的定义时,它会查找当前名称空间,然后查看englobing名称空间,依此类推,直到找到一个定义; 搜索然后停止(没有考虑参数依赖名称查找引入的复杂性 - 规则的一部分允许使用在其参数之一的命名空间中定义的函数).