首页 > 解决方案 > 重载的子类函数不能调用同名的父类

问题描述

我假设这是那些“只是不是它如何工作”的问题之一,但我不明白为什么。为什么我需要限定B对 sAStart调用A::。如果我更改B::Start()为,B::DoSomethingElse()我可以在Start()没有A::. 那么发生了什么?

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

标签: c++classinheritancescopename-lookup

解决方案


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

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

所以Start名称已经在 内找到class B,因此停止查找。重载解析仅在名称查找完成后发生[basic.lookup]/1

...名称查找成功后发生重载解决方案 (16.3) ....

因此,即使 classAB具有不同的参数,这也不会在这里发挥作用,因为名称查找已经完成。

当您这样做时A::Start(),您将使用限定名称查找,您实际上是在其中指定函数出现的类,因此名称解析将找到该版本。


推荐阅读