277 / 154 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
1

Общий код базового класса

03.05.2020, 14:38. Показов 1325. Ответов 2
Метки нет (Все метки)

Приветствую всех. Есть базовый класс с чистым виртуальным методом. Наследники при реализации этого метода в самом начале должны выполнить один и тот же код. Как правильно это сделать?

Объясню вопрос и мое решение на простом примере. Как видно из кода при реализации метода Eat в наследниках я вызываю метод CommonCode. Может быть существует какой-то другой подход для решения такой задачи?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Animal
{
    public:
    virtual void Eat() = 0;
    
    protected:
    void CommonCode() { cout << "Продукт питания: "; }
};
 
class Rabbit : public Animal
{
    public:
    void Eat() { CommonCode(); cout << "морковь" << endl; }
};
 
class Lion : public Animal
{
    public:
    void Eat() { CommonCode(); cout << "мясо" << endl; }
};
 
int main()
{
    Rabbit rabbit;
    Lion lion;
    
    rabbit.Eat();
    lion.Eat();
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2020, 14:38
Ответы с готовыми решениями:

Доступ к protected членам базового класса
Здравствуйте, форумчане! Ниже приведенный код при компиляции вызывает следующую ошибку: error...

Создать объект производного класса с передачей параметров в конструктор базового класса
Доброго времени суток! Если не затруднит, утолите мой интерес, пожалуйста! Есть базовый и...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

2
1262 / 1200 / 197
Регистрация: 19.02.2010
Сообщений: 3,463
03.05.2020, 20:23 2
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

Цитата Сообщение от d7d1cd Посмотреть сообщение
Может быть существует какой-то другой подход для решения такой задачи?
Паттерн Template method.

Цитата Сообщение от d7d1cd Посмотреть сообщение
Есть базовый класс с чистым виртуальным методом. Наследники при реализации этого метода в самом начале должны выполнить один и тот же код.
С указанным шаблоном проектирования будет наоборот.
В базовом классе - невиртуальный метод Eat(), в нём последовательно вызываются CommonCode() и виртуальный DerivedEat().
DerivedEat() в базовом классе - чистый виртуальный, в потомкам - реализует нужное добавочное поведение.
В общем, инверсия зависимости вызова (не наследник вызывает операцию из базового класса - а базовый класс дёргает переопределённый в наследнике метод).
1
277 / 154 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
04.05.2020, 11:06  [ТС] 3
VTsaregorodtsev, спасибо большое! Почему я сам не догадался, что так можно...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2020, 11:06
Помогаю со студенческими работами здесь

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru