@Anderwonder

Можно ли вызвать конструктор прародителя в обход конструктора родителя?

Есть 3 класса:
class GrandFather {
public:        
       GrandFather(int Capital)
       {
             ПостроитьДом();
        }
};
class Father:public GrandFather{
public:
        Father(int Capital):GrandFather(Capital)
       {
              КупитьСобаку();
       }
};
class Son:public Father{
public:
       Son(int Capital):Father(Capital)
       {
              КупитьКотэ();
       }
};


Каким образом сделать так, что бы конструктор класса Son вызывал бы конструктор класса GrandFather, но не вызывал конструктор Father?

Пока что сделал таким образом: добавил Father конструктор

Father(int Capital, int x):GrandFather(Capital){}

а конструктор Son сделал Son(int Capital):Father(Capital,1).

Но хотелось бы решение без лишних строчек.

Заранее спасибо.
  • Вопрос задан
  • 3153 просмотра
Решения вопроса 1
rasa
@rasa
Такой же вопрос, правда, про Яву.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@egorinsk
Предполагается, что конструктор предназначен для инициализации полей класса, например, тех, которые являются динамическими объектами. В таком случае, получается странная вещь, поле (в родителе) у нас есть, а код его инициализации не вызывается. Это неверно.

Бизнес-логику в конструктор помещать не стоит, функция «КупитьСобаку» должна быть вынесена из конструктора в специально предназначенное для этого место. Таким образом, проблема решится сама собой.
Ответ написан
Комментировать
Есть такое старое правило, что если возникает необходимость писать некрасивый код, значит в проектировании допущена ошибка. Если есть необходимость такого вызова конструктора, как вы описали, то стоит пересмотреть организацию иерархии классов.
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Нельзя ли обойтись агрегацией вместо наследования?
Ответ написан
bogolt
@bogolt
Сделайте два конструктора Father, один покупающий собаку а другой не покупающий ее, и вызывайте тот что вам нужен. Ну или как вы сами предложили можно передавать атрибут говорящий о нужности этого действия
Father(int capital, bool need_to_buy_god);


Вообще же в си++ невозможно не вызывать конструктор при создании объекта, можно лишь выбрать какой из конструкторов будет вызван.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы