我不知道为什么我得到“错误C2660:'SubClass :: Data':函数不带2个参数”。当我尝试编译我的项目时。
我有一个带有一个名为data的函数的基类。该函数接受一个参数,数据重载需要2个参数。 在我的subClass中,我覆盖了带有1个参数的数据函数。现在,当我尝试从指向subClass的指针调用数据的重载时,我收到上面的编译错误。
class Base : public CDocument
{
Public:
virtual CString& Data( UINT index);
CString Data( UINT index, int pos);
};
class SubClass : public Base
{
Public:
virtual CString& Data( UINT index);
};
Void SomeOtherFunction()
{
subType* test = new subType();
test->Data( 1, 1);// will not compile
((Base*)test)->Data(1,1); // compiles with fine.
}
答案 0 :(得分:8)
C ++编程语言( p。 392,第2版。):
15.2.2继承和使用声明
重载决策不适用于不同的类范围(第7.4节)......
您可以使用限定名称访问它:
void SomeOtherFunction()
{
SubClass* test = new SubClass();
test->Base::Data(1, 1);
}
或向SubClass
添加使用声明:
class SubClass : public Base
{
public:
using Base::Data;
virtual CString& Data( UINT index);
};
void SomeOtherFunction()
{
SubClass* test = new SubClass();
test->Data(1, 1);
}
答案 1 :(得分:3)
您在Data(UINT index)
'中覆盖SubClass
会隐藏基类中的重载。
解决方案是像这样编写SubClass:
class SubClass : public Base
{
public:
using Base::Data; // <--- brings all the overloads into scope
virtual CString& Data( UINT index);
};
现在test->Data(1,1)
应该有效。
答案 2 :(得分:1)
您必须在SubClass
中使用Base :: Data添加看看第33项:避免隐藏有效C ++的继承名称
答案 3 :(得分:1)
hiding rule正试图保护自己免受伤害。
答案 4 :(得分:0)
当覆盖基类中声明的函数时,具有该名称的所有其他函数将隐藏在子类中。如前所述,您需要通过using Base :: Data声明将这些名称带入子类的范围。