>>>Уважаемые коллеги, укажите, пожалуйста, где я тут не прав:
>>>
>>>---tmp02.cpp---
>>>class base {
>>>public:
>>> virtual int test() { return 0; };
>>> virtual int test(int a) { test(); return 0; };
>>>};
>>>
>>>class child: public base {
>>>public:
>>> int test() { return 1; };
>>>};
>>>
>>>int main(int argc, char *argv[]) {
>>> child c1;
>>> c1.test(1);
>>> return 0;
>>>}
>>>
>>>/* gcc-3.4.4
>>>Компиляция tmp02.cpp (g++)
>>>tmp02.cpp:15: error: no matching function for call to `child::test(int)'
>>>tmp02.cpp:9: note: candidates are: virtual int child::test()
>>>*** Завершено с кодом: 2 ***
>>>*/
>>>---tmp02.cpp---
>>
>>Виртуальная функция test() в производном классе у тебя переопределена, соответственно она должна
>>вызываться у тебя без аргуметов.
>
>
>В том-то и дело, что я переопределяю только одну из двух виртуальных
>функций с одинаковым названием (а именно test()), но с различным числом
>параметров, что должно трактоваться как две разных функции (если я ничего
>не путаю). Соотв. я ожидал, что функция test(int a) достанется
>в наследство от base, в которой вызывается test(), которую я и
>собирался переопределять в производных классах. Что же получается, что, переопределив одну
>из функций, я теряю доступ к остальным функциям с таким же
>именем?
(sorry for writing in english, have not been using cyrillic keyboard for several years, forgot layout ;)
That's exactly what happens.
See, for example:
http://cpptips.hyperformix.com/cpptips/virt_name_hide
As you can see, that was a confusing topic even in 1991 ;)
According to the C++ rules, a name defined in the derived class (in your case, child::test), not overrides, but _hides_ the name from the base class - it means that all methods, data members (perhaps even enum members and embedded classes?) with the same name are not visible in the derived class - the method signature - test() or test(int) - is not taken into account here.
В таком случае теряется смысл перегрузки (по крайней мере, при
>использовании ее в таком виде). Как выход, придется давать функциям разные
>имена. Или есть другое решение?
I'm not sure right away, and am too lazy to test, but something like:
child c;
c.base::test(5);
might work - try it?
>
>С.Г.