C++ 重载和覆盖

标签 c++ inheritance overriding overloading encapsulation

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

error: no matching function for call to '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);
}

最佳答案

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

Demo

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

B* ptr = new C;

然而,这种隐藏并不是一个特别好的主意......你应该更喜欢覆盖和命名不同的功能。

关于C++ 重载和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402170/

相关文章:

c++ - 重新声明纯虚函数

css - 覆盖没有默认值的 CSS 属性

c# - 覆盖另一个程序集中的内部抽象方法

c++ - 派生类的成员函数

c++ - 如何将shared_ptr转换为私有(private)基类?

html - 覆盖 CSS 样式还是添加它?

c# - 覆盖派生类中的默认值 (c#)

c++ - 从二维数组 c++ 打印空格而不是整数

c++ - 将没有默认构造函数的类设为另一个类的私有(private)属性

c++ - 为什么这个返回类型不起作用? (C++)