C++重载和覆盖

Rab*_*aly 6 c++ inheritance encapsulation overriding overloading

此代码生成以下编译错误:

错误:没有匹配函数来调用'C :: print(int)'

你能帮我弄清楚编译器产生错误的过程,(为什么它忽略了B类中的函数)

#include <iostream>
using std::cout;
class A {
public:
  virtual void print () 
   { cout << "A";}
};
class B : public A {
   int x;
 virtual void print (int y) 
   {cout << x+y;}
};

class C : public B {
public:
  void print ()
   {cout << "C";}
};

int main () {
  C* ptr = new C;
  ptr->print (5);
}
Run Code Online (Sandbox Code Playgroud)

And*_*dyG 5

每个后续定义都print隐藏其父级.你需要一个using声明来取消它:

class A {
public:
  virtual void print () 
   { cout << "A";}
};
class B : public A {
public:
   int x=1;
 using A::print;
 virtual void print (int y) 
   {cout << x+y;}
};

class C : public B {
public:
  using B::print;
  void print ()
   {cout << "C";}
};
Run Code Online (Sandbox Code Playgroud)

演示

你的指针是C*,而不是B*.如果您的代码如下所示,您在技术上不需要"取消隐藏"任何打印功能:

B* ptr = new C;
Run Code Online (Sandbox Code Playgroud)

然而,这种隐藏并不是一个特别好的主意......你应该更喜欢覆盖,只是命名函数不同的东西.