У меня есть некий абстрактный класс, назовем его 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 сделало бы мой код красивее и понятнее.
Думаю, что понятно изложил вопрос. Буду очень благодарен любой помощи!
А как вы себе представляете наследование? Что компилятор должен делать, если вы напишете такой код.
Abstr* test = new Test3(param);
test->show(my_ptr);
Метод show(int *) должен быть у Test3 обязательно. Если это не противоречит логике класса, можно оставить оба метода, и show(int *) и show(), но, в таком случае, show() вы сможете вызвать только при явном приведение типа.
Если противоречит, то можно show(int*) в Test3 заасертить или выбрасывать исключение, но это совсем не хорошая практика. Разбираться в коде, где некоторые методы объявлены но не реализованы тяжело.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей