Наследование абстрактного класса

103
30 апреля 2021, 23:30

У меня есть некий абстрактный класс, назовем его Abstr. У него есть чисто виртуальная функция, что выводит на экран принятый указатель (разыменовывает и выводит). Т.е., имеем следующее:

class Abstr
{
    ...
public:
    ...
    virtual void show(int *) const = 0;
    ...
};

От него наследуются два класса: Test1 и Test2. Они переопределяют его метод show:

class Test1 : public Abstr
{
    ...
public:
    ...
    void show(int *) const override { ... }
    ...
};
class Test2 : public Abstr
{
    ...
public:
    ...
    void show(int *) const override { ... }
    ...
};

Также есть третий класс - Test3. Он инкапсулирует указатель на тип int. Тут не буду описывать все конструкторы и перегрузки операторов этого класса.

class Test3
{
private:
    int * ptr;
public:
    void show() const { ... }
    ...
};

Он тоже имеет свою функцию show - она выводит на экран разыменованный указатель ptr. Итак, классы Test1, Test2 и Test3 похожи - они работают с указателями. Вот только первые два в методе show принимают указатель для вывода, а Test3 выводит инкапсулированный указатель.

Вопрос.
Надеюсь, общую картину вы поняли. Теперь сам вопрос.
Я наследую класс Test3 от класса Abstr. Но метод show в абстрактном классе принимает указатель, а его перегрузке в Test3 принимать указатель не нужно, поскольку внутри класса есть поле-указатель ptr, что и должен выводиться в этом методе.

Т.е., я хочу наследоваться от класса Abstr и переопределить его чисто виртуальную функцию show так, чтобы она не принимала параметр. Как мне это сделать?

Мои размышления на этот счет: От класса Abstr можно наследоваться только в классах Test1 и Test2, а об идее наследования классом Test3 забыть.
Но все же я думаю, что наследование классом Test3 от класса Abstr сделало бы мой код красивее и понятнее.

Думаю, что понятно изложил вопрос. Буду очень благодарен любой помощи!

Answer 1

А как вы себе представляете наследование? Что компилятор должен делать, если вы напишете такой код.

Abstr* test = new Test3(param);
test->show(my_ptr);

Метод show(int *) должен быть у Test3 обязательно. Если это не противоречит логике класса, можно оставить оба метода, и show(int *) и show(), но, в таком случае, show() вы сможете вызвать только при явном приведение типа. Если противоречит, то можно show(int*) в Test3 заасертить или выбрасывать исключение, но это совсем не хорошая практика. Разбираться в коде, где некоторые методы объявлены но не реализованы тяжело.

READ ALSO
JQuery и одинаковые имена

JQuery и одинаковые имена

У меня есть 6 штук блоков, каждые называются одинаково, только значения в теге <b>12</b> разные

122
Рендеринг HTML-элементов с помощью perspective?

Рендеринг HTML-элементов с помощью perspective?

Цель состоит в том, чтобы визуализировать элементы HTML в перспективе, как в примерах ниже

125
Как выбрать дочерние элементы первого уровня

Как выбрать дочерние элементы первого уровня

Как изменить стили только у li с надписью Категория 1 ур

116
Загрузка фото через инпут

Загрузка фото через инпут

нужно реализовать загрузку фотографий через текстовый инпут, те пользователь вставляет ссылку на картинку в инпут, нажимает добавить и и у него...

125