C ++重载和覆盖

时间:2017-07-30 16:36:25

标签: c++ inheritance override overloading encapsulation

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

  

错误:没有匹配函数来调用'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);
}

3 个答案:

答案 0 :(得分:5)

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";} }; 语句才能取消隐藏:

C*

Demo

您的指针指向B*,而不是B* ptr = new C; 。你在技术上不需要取消隐藏&#39;如果你的代码看起来像这样的任何打印函数:

{{1}}

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

答案 1 :(得分:1)

编译器为最近看到的(类)类型解析重载。因此,类C有效隐藏从类B继承的函数签名。

要调用该特定功能,您必须明确限定其范围:

ptr->B::print (5);
  // ^^^

答案 2 :(得分:0)

重载意味着两个东西(例如函数)在相同的空间或范围中具有相同的名称,就像在同一个类中一样,但是在重写时我们在不同的范围(类)中重写函数的定义,但名称仍然保持不变。