【问题标题】:compilation error regarding name hiding ,override and virtual table关于名称隐藏、覆盖和虚拟表的编译错误
【发布时间】:2014-01-28 22:57:05
【问题描述】:

我在玩 c++ 规则。我遇到了一个错误,但我无法解释。请帮助解释为什么会发生编译错误。顺便说一句,我对解决这个问题并不感兴趣。谢谢

Q1 为什么名称隐藏在这种情况下不起作用?例如,如果我们删除 lineA 的关键字 virtual。编译将起作用

Q2在case2中添加函数后,编译通过。

请帮助解释 Q1 和 Q2。

#包括

using namespace std;

class base
{
   public:
      virtual int func() // lineA
      {
         cout << "vfunc in base class\n";
         return 0;
      }
};

class derived: public base
{
   public:
      double func()
      {
         cout << "vfunc in derived class\n";
         return 0;
      }
};

int main()
{
   return 0;
}

输出:

main.cpp:18:14: error: conflicting return type specified for 'virtual double derived::func()'
       double func()
              ^
main.cpp:8:19: error:   overriding 'virtual int base::func()'
       virtual int func()

案例2:

#include <iostream>

using namespace std;

class base
{
   public:
      virtual int func()
      {
         cout << "vfunc in base class\n";
         return 0;
      }
     // new added 
      virtual double func(int)
      {
          return 0.0;
      }
};

class derived: public base
{
   public:
      double func(int)
      {
         cout << "vfunc in derived class\n";
         return 0;
      }
};

int main()
{
   return 0;
}             ^

【问题讨论】:

  • 似乎不言自明; double func()int func() 冲突。
  • 但如果你删除 virtual ,编译工作。
  • 是的。因为虚函数不同。
  • 我知道它是不同的。你能解释一下导致这个错误的原因吗?
  • 为什么你认为你写的应该行得通?

标签: c++ overriding overloading vtable name-hiding


【解决方案1】:

当你重写一个函数时,你的新实现必须是可调用的,只要原始实现是可调用的。这里的base 函数返回一个int。这意味着任何来电者都会期待int

发生错误是因为您的覆盖函数返回的是 double 而不是 int

【讨论】:

    【解决方案2】:

    编译器错误表明您已经为 func() 定义了不同的返回类型。您可能认为这应该通过 C++ 重载来处理,但重载只能在输入参数上完成,而不能在返回值上完成。 例如:

    class base
    {
       public:
          virtual int func(int param)
          {
             cout << "vfunc in base class\n";
             return 0;
          }
    };
    
    class derived: public base
    {
       public:
          double func(double param)
          {
             cout << "vfunc in derived class\n";
             return 0;
          }
    };
    

    在此代码中,func 在派生中被重载,因为它具有另一种输入参数的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2014-08-13
      • 2010-10-25
      相关资源
      最近更新 更多