#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.