我在玩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;
} ^
答案 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在派生时被重载,因为它具有输入参数的另一种类型。