【问题标题】:Basic Class Inheritance in C++C++中的基本类继承
【发布时间】:2021-02-18 10:56:51
【问题描述】:

我正在输入以下代码,并且在第 1 行收到以下错误
[Error] no matching function for call to 'int_adder::add()

#include <iostream> 
using namespace std; 

class adder{ 
  public: 
  void add(){ cout <<"adder::add() "; } 
}; 

class int_adder : public adder{ 
  public: 
  int add(int a, int b){
    return (a + b); 
  }
};

int main(){ 
  int_adder ia; 
  ia.add(); //LINE-1 
  cout << ia.add(10, 20); //LINE-2 
  return 0; 
}

【问题讨论】:

  • 您在int_adder 中的函数正在影响基类中的函数。要将其拉入重载集,您可以在 int_adder 的定义中添加 using adder::add;
  • int_adder::add() 的签名(参数类型和返回类型)与 adder::add() 不同。根据标准,int_adder::add() 具有隐藏adder::add() 的效果,不会覆盖它或重载它。这被非正式地描述为“隐藏规则”。
  • 这能回答你的问题吗? stackoverflow.com/questions/18688799/…
  • 这能回答你的问题吗? What is the hiding rule in c++?

标签: c++ c++11 c++17


【解决方案1】:

正如评论中其他人指出的那样,我已经更正了它:-

#include <iostream> 
using namespace std; 

class adder{ 
  public: 
    void add(){ cout <<"adder::add() "; } 
}; 

class int_adder : public adder{ 
  public: 
     int add(int a, int b){
          return (a + b); 
     }
};

int main(){ 
  int_adder ia; 
  ia.adder::add(); //LINE-1 
  cout << ia.add(10, 20); //LINE-2 
  return 0; 
}

语句adder::add() 将覆盖int_adder 中的函数add()

【讨论】:

    【解决方案2】:

    无法找到确切的欺骗,但您可以使用 using 指令、example 使基类中的重载可见:

    #include <iostream> 
    using namespace std; 
    
    class adder{ 
      public: 
      void add(){ cout <<"adder::add() "; } 
    }; 
    
    class int_adder : public adder{ 
      public: 
      using adder::add; // expose base class overload as our own
    
      int add(int a, int b){
        return (a + b); 
      }
    };
    
    int main(){ 
      int_adder ia; 
      ia.add(); //LINE-1 
      ia.adder::add(); // explicit name also works
      cout << ia.add(10, 20); //LINE-2 
      return 0; 
    }
    

    正如另一个答案提到的,使用基类名称范围也可以。这完全取决于您的需求和课程设计。

    基本上在派生类中定义重载会防止隐式方法查找匹配基类重载,因此您必须以一种或另一种方式明确它。

    【讨论】:

      【解决方案3】:

      首先,您有两个完全不同的 add 版本。你不是压倒一切,你是超载。您只是提供了一个新的 add 函数,与父级的其他 add 函数无关。

      那么首先,你是要覆盖还是重载?

      覆盖父添加将如下所示:

      #include <iostream> 
      using namespace std; 
      
      class adder{ 
        public: 
          void add(){ cout <<"adder::add() "; } 
      }; 
      
      class int_adder : public adder{ 
        public: 
           int add() override {cout <<"int_adder ::add() ";}; 
           int add(int a, int b){
                return (a + b); 
           }
      };
      
      int main(){ 
        int_adder ia; 
        ia.adder::add(); //LINE-1 <- would work displays adder::add()'s message
        cout << ia.add(10, 20); //LINE-2 
        
        adder ia = int_adder{}; // now this is interesting
        ia.add(); // would work displays adder::add()'s message - cause you did not ask for virtuality
      
        return 0; 
      }
      

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多