提问者:小点点

重载的子类函数无法调用类似名称的父类[重复]


我假设这是其中一个“只是不是如何运作”的问题,但我不明白为什么。 为什么我需要用a::限定basstart的调用。 如果我将b::start()更改为b::DoSomethingElse(),我可以在没有a::的情况下调用更少的start()参数。 那么到底发生了什么?

#include <iostream>
#include <string>

class A {
  public:
    void Start(){
        
    }
};

class B : public A {
    public:
        void Start(int x){
            Start();     // cannot call this  
            A::Start();  // can call this  
        }
};

共2个答案

匿名用户

来自C++标准(草案,强调mine)[basic.lookup.unqual]/1:

在6.4.1中列出的所有情况下,按照每个相应类别中列出的顺序搜索范围以查找声明; 一旦找到名称的声明,名称查找就会结束。 如果没有找到声明,则程序的格式不正确。

因此已经在Class B中找到了start名称,因此停止查找。 仅在名称查找完成[basic.lookup]/1:

。。。重载解析(16.3)发生在名称查找成功后。。。。

因此,即使类ab具有不同的参数,这在这里并不起作用,因为名称查找已经完成。

当您执行a::start()时,您将使用限定名称查找,在该查找中您将实际指定函数出现的类,因此名称解析将查找该版本。

匿名用户

b的类定义中使用的非限定名称start

class B : public A {
    public:
        void Start(int x){
            Start();     // cannot call this  
            A::Start();  // can call this  
        }
};

首先在类b的作用域中搜索,并找到这样一个名称,因为该类声明了函数start。 即在派生类b中声明的名称start隐藏了在基类a中声明的相同名称。 要访问基类a中声明的名称start,必须使用限定名。