为什么我不能使用subClass的指针访问基类的公共函数?

时间:2009-12-02 21:37:51

标签: c++ visual-c++

我不知道为什么我得到“错误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.
}

5 个答案:

答案 0 :(得分:8)

Bjarne Stroustrup的

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声明将这些名称带入子类的范围。