繁体   English   中英

C ++继承和功能覆盖

[英]C++ inheritance and function overriding

在C ++中, 即使原型(参数的数量,类型和常量)不同,基类的成员函数也会被同名的派生类函数覆盖吗? 我猜这是一个愚蠢的问题,因为许多网站都说功能原型应该是相同的。 但是为什么下面的代码不能编译? 我认为,这是一个非常简单的继承案例。

#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;
}

GCC抛出

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

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

using X::spray;

所谓的“隐藏”: Y::spray隐藏X::spray 使用指令添加:

class Y : public X
{
public:
   using X::spray;
   // ...
};

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

发生的事情是,当名称查找搜索名称的定义时,它将在当前名称空间中查找,然后在包含名称空间的名称中查找,依此类推,直到找到一个定义; 然后搜索就停止了(这没有考虑参数依赖名称查找所带来的复杂性-规则的一部分,该规则允许使用在其参数之一的名称空间中定义的函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM