关于隐藏,覆盖和虚拟表的汇编错误

compilation error regarding name hiding ,override and virtual table

本文关键字:虚拟 错误 汇编 覆盖 于隐藏 隐藏      更新时间:2023-10-16

我在玩C 规则。我碰到了一个错误,但我无法解释。请帮助解释为什么汇编错误发生。顺便说一句,我对解决问题并不有趣。谢谢

Q1为什么藏身名称不起作用?例如,如果我们删除Linea的关键字Virtual。汇编将有效

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

请帮助解释Q1和Q2。

#include

using namespace std;
class base
{
   public:
      virtual int func() // lineA
      {
         cout << "vfunc in base classn";
         return 0;
      }
};
class derived: public base
{
   public:
      double func()
      {
         cout << "vfunc in derived classn";
         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 classn";
         return 0;
      }
     // new added 
      virtual double func(int)
      {
          return 0.0;
      }
};
class derived: public base
{
   public:
      double func(int)
      {
         cout << "vfunc in derived classn";
         return 0;
      }
};
int main()
{
   return 0;
}             ^

当您覆盖功能时,每当原始的实现都必须可调用。base功能在这里返回int。这意味着任何呼叫者都会期望int

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

以及编译器错误指出您已定义了func()的不同返回类型。您可能会认为这应该通过C 过载来掌握,但是过载只能在不在返回值上的输入参数上完成。例如:

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

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