Почему дочерний класс затеняет родительские методы, даже если параметры имеют другой тип

#c #oop

Вопрос:

Мой родительский класс содержит две функции: On должен быть перезаписан дочерним, второй (с тем же именем) просто использует в качестве входных данных другой тип и использует перезаписанный метод. Теперь я понимаю, что если я определю в дочернем классе метод с тем же именем и теми же входными параметрами, он затенится (это правильное выражение?) метод родителей. Но я все еще могу вызвать метод родителей, назвав его явным, например: b.A::getSize(...) .

Мой вопрос: почему родительский метод затеняется, даже если типы входных параметров разные? Почему компилятор не может найти родительский метод с правильными типами ввода? См. Приведенный ниже минимальный пример.

И бонусный вопрос: Возможно ли добиться такого поведения, при котором я могу вызывать родительский метод без необходимости явного вызова и без изменения main(){...} class B{...}; или использования других имен?

 #include lt;cstdiogt;  class A{  public:  virtual void getSize(size_t amp;i) = 0;   void getSize(int amp;d){  size_t i;  getSize(i);  d = static_castlt;intgt;(i);  } };  class B : public A{  public:  void getSize(size_t amp;i) override{  i = 4;  } };  int main(){  size_t t;  int i;  B b;  b.getSize(t);  b.getSize(i); // error: non-const lvalue reference to type 'size_t' (aka 'unsigned long') cannot bind to a value of unrelated type 'int'  b.A::getSize(i); // this works but is not acceptable (too much changes in production code)  printf("%zu, %d",t,i);  return 0; }  

Комментарии:

1. Если вы хотите сделать родительский метод видимым в интерфейсе унаследованных классов, вам следует использовать инструкцию using для его отображения using A::getSize; .

2. хм, извини, но это не помогает. Как мне грустно: я не хочу менять основное (в этом минимальном рабочем примере это просто, но) Я не хочу изменять (добавлять using A::getSize() ) около 100 различных устаревших (старых) функций кода). Бесконечный цикл-моя ошибка … это правильно. int i должно быть size_t i , я это исправил, спасибо.

3. @Jakobimatrix: Нет, вы не включаете using A::getSize() все функции, которые в этом нуждаются. Ты его вставил B .

4. @user2357112 поддерживает Монику: На самом деле это приемлемое решение… Сначала я испугался, так как было много детских занятий, но только у немногих были проблемы (что, к счастью, но я так понимаю).

Ответ №1:

Вы можете указать метод с помощью инструкции using:

 class B : public A {  // ...  using A::getSize; }  

В своих фрагментах кода вы во многих местах использовали неинициализированные значения, это вызывает UB.