Почему я не могу получить доступ к публичной функции базового класса с указателем на подкласс? - PullRequest
1 голос
/ 03 декабря 2009

Я не уверен, почему я получаю «ошибку C2660:« SubClass :: Data »: функция не принимает 2 аргумента». когда я пытаюсь скомпилировать свой проект.

У меня есть базовый класс с функцией под названием data. Функция принимает один аргумент. Перегрузка данных, которая принимает 2 аргумента. В моем подклассе я переопределяю функцию данных, принимающую 1 аргумент. Теперь, когда я пытаюсь вызвать перегрузку данных из указателя на подкласс, я получаю вышеуказанную ошибку компиляции.

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 ]

8 голосов
/ 03 декабря 2009

Язык программирования 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);
}
3 голосов
/ 03 декабря 2009

Переопределение Data(UINT index) в SubClass скрывает перегрузку в базовом классе.

Решение состоит в том, чтобы кодировать подкласс следующим образом:

class SubClass : public Base
{
public:
using Base::Data;    // <--- brings all the overloads into scope
virtual CString&    Data( UINT index);          
};

Теперь test->Data(1,1) должно работать.

1 голос
/ 03 декабря 2009

Это правило сокрытия , пытающееся защитить вас от себя.

1 голос
/ 03 декабря 2009

Вы должны добавить, используя Base :: Data в вашем подклассе

Взгляните на пункт 33: избегайте сокрытия унаследованных имен Effective C ++

0 голосов
/ 03 декабря 2009

Когда вы переопределяете функцию, объявленную в базовом классе, все другие функции с таким именем становятся скрытыми в подклассе. Как упоминалось ранее, вам нужно будет ввести эти имена в область действия подкласса с помощью объявления Base :: Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...