关于名称隐藏,覆盖和虚拟表的编译错误

时间:2014-01-28 22:57:06

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

我在玩c ++规则。我遇到了错误,但我无法解释。请帮助解释编译错误发生的原因。顺便说一句,我没有兴趣解决这个问题。谢谢

Q1为什么名字隐藏在案件中不起作用?例如,如果我们删除lineA的关键字virtual.the编译将起作用

Q2在case2中添加了一个函数后,编译就完成了。

请帮助解释Q1和Q2。

#include

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

2 个答案:

答案 0 :(得分:0)

当您覆盖某个函数时,无论原始实现是什么,您的新实现都必须是可调用的。这里的base函数返回int。这意味着任何来电者都会期待int

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

答案 1 :(得分:0)

编译错误说明你已经为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在派生时被重载,因为它具有输入参数的另一种类型。