关于名称隐藏、重写和虚拟表的编译错误 我玩C++规则。我犯了一个错误,但我无法解释。请帮助解释发生编译错误的原因。顺便说一句,我对解决这个问题不感兴趣。谢谢

关于名称隐藏、重写和虚拟表的编译错误 我玩C++规则。我犯了一个错误,但我无法解释。请帮助解释发生编译错误的原因。顺便说一句,我对解决这个问题不感兴趣。谢谢,c++,overriding,overloading,vtable,name-hiding,C++,Overriding,Overloading,Vtable,Name Hiding,Q1为什么名称隐藏在案例中不起作用?例如,如果我们删除lineA的关键字virtual.com,编译将正常工作 Q2在案例2中添加了一个函数后,编译将完成 请帮助解释Q1和Q2 #包括 案例2: #include <iostream> using namespace std; class base { public: virtual int func() { cout << "vfunc in base class\n"

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

Q2在案例2中添加了一个函数后,编译将完成

请帮助解释Q1和Q2

#包括

案例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;
}             ^
#包括
使用名称空间std;
阶级基础
{
公众:
虚int func()
{

cout重写函数时,无论何时调用原始实现,新实现都必须是可调用的。此处的
base
函数返回
int
。这意味着任何调用方都需要
int


错误发生是因为您的重写函数返回了<代码>双<代码>,而不是<代码> int <代码> .< /p> 编译错误说明您已经为函数()定义了不同的返回类型。您可能认为这应该是由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;
      }
};
类基
{
公众:
虚拟整数函数(整数参数)
{

cout似乎是不言自明的;
double func()
int func()
冲突。但是如果删除虚拟函数,编译就可以工作。是的。因为虚拟函数不同。我知道它不同。你能解释导致此错误的原因吗?为什么你认为你编写的应该工作?
#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;
}             ^
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;
      }
};