LINUX.ORG.RU

Overloading функции базового класса


0

0

Не может ли кто объяснить с технической точки зрения, почему
в наследуемом классе не разрешена перегрузка метода, который
определен в базовом классе?

Вот пример:

/*Base.h*/
class Base {
public:
~virtual Base(void);
void add(void);
protected:
Base(void);
};

/*Base.cpp*/
Base::Base(void) {};
~Base::Base(void) {};
void Base::add(void) {};


/*Extended.h*/
class Extended : public Base {
public:
Extended(void);
~Extended(void);
void add(int i);
};

/*Extended.cpp*/
Extended::Extended(void) : Base() {};
~Extended::Extended(void) {};
void Extended::add(int i) {
add(); // <--- вот здесь no matching function for call to `Extended::add()'
};


Сигнатуры add() различаются, это недопустимая ситуация, компилятор на такое ругается.

anonymous
()
Ответ на: комментарий от Tsahes

Это пример "затенения" (shadowing) функции базового класса.

anonymous
()

> Не может ли кто объяснить с технической точки зрения, почему
> в наследуемом классе не разрешена перегрузка метода, который
> определен в базовом классе?

Она разрешена. Просто при перегрузке, _все_ методы базового класса с
совпадающим именем скрываются, вне зависимости от сигнатуры. Так что в
данном случае нужно использовать полное имя метода, Base::add(). А если
тебе нужно, чтоб этот метод торчал наружу и в классе Extended, то
перегрузи его еще раз именно как add(void), и внутри сделай вызов
Base::add().

int19h ★★★★
()

Нетривиально! Тогда все прояснилось. Я ошибочно полагал, что сокрытие может выполняться только для метода с точно такой же сигнатурой.

Tsahes
() автор топика
Ответ на: комментарий от int19h

> А если тебе нужно, чтоб этот метод торчал наружу и в классе Extended,
> то перегрузи его еще раз именно как add(void), и внутри сделай вызов
> Base::add().

Кстати, вот здесь я забыл про одну (нечасто используемую) фичу. Можно
просто в Extended написать:

  using Base::add;

См. http://www.research.att.com/~bs/bs_faq2.html#overloadderived

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.