Задать вопрос
@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).

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

Заранее спасибо.
  • Вопрос задан
  • 3165 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 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);


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

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

Похожие вопросы