Перегрузка и наследование
От: Аноним  
Дата: 23.05.10 11:20
Оценка: :)
class A {
public:
  void foo() {
    cout << "A::foo()" << endl;
  }

  void foo(int a) {
    cout << "A::foo( int )" << endl;
  } 
};
 
class B : public A {
public:
  void foo(int a) {
    cout << "B::foo( int )" << endl;
  }

};

int main()
{
  B b;
  b.foo();
  return 0;
}

Компилятор выдает ошибку:
ошибка: нет подходящей функции для вызова ‘B::foo()’
замечание: претенденты: void B::foo(int)


Т. е. при переопределении функции в наследнике необходимо переопределять все перегруженные версии функции. Не кажется ли вам нелогичным такое поведение? По-моему, логичнее было бы вызывать подходящую по сигнатуре функцию родительского класса.
Re: Перегрузка и наследование
От: _nn_  
Дата: 23.05.10 11:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Т. е. при переопределении функции в наследнике необходимо переопределять все перегруженные версии функции. Не кажется ли вам нелогичным такое поведение? По-моему, логичнее было бы вызывать подходящую по сигнатуре функцию родительского класса.


1. Поиск
2. using A::f
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Перегрузка и наследование
От: j_n_ig  
Дата: 23.05.10 12:55
Оценка: :))
Здравствуйте, _nn_, Вы писали:
__>1. Поиск
Что "поиск"?
__>2. using A::f
Как вызвать метод родительского класса я знаю. Вопрос в том, почему он не вызывается автоматически.
Re[3]: Перегрузка и наследование
От: _nn_  
Дата: 23.05.10 13:06
Оценка: +2
Здравствуйте, j_n_ig, Вы писали:

__>Здравствуйте, _nn_, Вы писали:

__>>1. Поиск
__>Что "поиск"?
Воспользоваться поиском
http://rsdn.ru/search/

__>>2. using A::f

__>Как вызвать метод родительского класса я знаю. Вопрос в том, почему он не вызывается автоматически.
Это не вызов метода.
Вызов метода не содержит using.

class A {
public:
  void foo() {
    cout << "A::foo()" << endl;
  }

  void foo(int a) {
    cout << "A::foo( int )" << endl;
  } 
};
 
class B : public A {
public:
  using A::f;

  void foo(int a) {
    cout << "B::foo( int )" << endl;
  }

};

int main()
{
  B b;
  b.foo();
  return 0;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Перегрузка и наследование
От: Кодт Россия  
Дата: 23.05.10 13:11
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Т. е. при переопределении функции в наследнике необходимо переопределять все перегруженные версии функции. Не кажется ли вам нелогичным такое поведение? По-моему, логичнее было бы вызывать подходящую по сигнатуре функцию родительского класса.


кейворд: "сокрытие имён", "name hiding"
разруливается так
struct A
{
  void foo();
  void foo(int);
};

struct B : A
{
  using A::foo;
  void foo(int);
};


По поводу логичности сокрытия имён — вопросы к Бьярну.
Перекуём баги на фичи!
Re: Перегрузка и наследование
От: slava_phirsov Россия  
Дата: 24.05.10 10:52
Оценка:
Здравствуйте, Аноним, Вы писали:

уже было тут
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.