【问题标题】:C++ overloading and overridingC++ 重载和覆盖
【发布时间】:2017-07-30 16:36:24
【问题描述】:

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

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

【问题讨论】:

    标签: c++ inheritance overriding overloading encapsulation


    【解决方案1】:

    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;
    

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

    【讨论】:

      【解决方案2】:

      编译器为最接近的(类)类型解析重载。所以C 类有效地隐藏B 类继承的函数签名。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          相关资源
          最近更新 更多