C++ C+中的基本类继承+;

C++ C+中的基本类继承+;,c++,c++11,c++17,C++,C++11,C++17,我正在键入以下代码,在第1行出现以下错误 [错误]调用'int_adder::add()时没有匹配的函数 #包括 使用名称空间std; 类加法器{ 公众: void add(){cout正如其他人在评论中指出的,我已经纠正了它:- #include <iostream> using namespace std; class adder{ public: void add(){ cout <<"adder::add() "; }

我正在键入以下代码,在第1行出现以下错误
[错误]调用'int_adder::add()时没有匹配的函数

#包括
使用名称空间std;
类加法器{
公众:

void add(){cout正如其他人在评论中指出的,我已经纠正了它:-

#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; 
}
#包括
使用名称空间std;
类加法器{
公众:

void add(){cout无法复制,但您可以使用
using
指令,使基类中的重载可见:

#包括
使用名称空间std;
类加法器{
公众:

void add(){cout首先,您有两个完全不同的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; 
}
#包括
使用名称空间std;
类加法器{
公众:

void add()
。根据标准,
int\u adder::add()
具有隐藏
adder::add()
,而不是覆盖或重载它的效果。这被非正式地称为“隐藏规则”。这是否回答了您的问题?这是否回答了您的问题?
#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; 
}
#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; 
}