пятница, 4 июня 2010 г.

Function overload

Как известно, если в наследнике определить функцию с таким же именем, как в базовом классе, то она скроет все функции этого базового класса с этим именем не смотря на аргументы. Например,
struct B {
void f( char );
void f( std::string );
};

struct D : B {
void f(int) { f('c'); } // получаем рекурсивный вызов D::f(int)
};

Однако, если мы хотим оставить функцию(или несколько функций) базового класса, а не скрывать её, то можно написать using B::f;
struct D : B {
using B::f;
void f( int ) { f('c'); } // вызывается B::f(char)
};

3 комментария:

  1. 1) А зачем для всего класса? Можно прямо в теле f и написать этот using. Область его действия тогда этой функцией и будет ограничена.
    2) В первом примере кода в комментарии должно быть "получаем рекурсивный вызов D::f(int)"
    3) Можно просто в теле D::f написать B::f('c') и не мучаться.

    ОтветитьУдалить
  2. Для всего класса, чтобы пользователю класса D открыть функцию класса B, чтобы каждый раз он не мучался с полным названием функции.

    В комментарии действительно опечатка была, поправил.

    ОтветитьУдалить