Конструкторы с наследованием в с ++ - PullRequest
1 голос
/ 06 мая 2010

Если у вас есть 3 класса, со стрелками, переходящими от родительских к дочерним классам (т.е. «A -> B» означает «B наследует от A»:

shape -> 2d shape -> circle
  +----> 3d shape -> sphere

Когда вы пишете свой конструктор для класса круга, вы когда-нибудь просто инициализируете объект Shape прародителя, а затем ваш текущий объект, пропуская средний класс? Мне кажется, вы могли бы иметь координаты x, y для Shape и инициализировать их в конструкторе, а также инициализировать радиус в классе круга или сферы, но в классах 2D или 3D я не знаю, что добавить в конструктор так как кажется, что он будет идентичен по форме. Так что-то вроде этого действительно

Circle::Circle(int x, int y, int r) : Shape(x, y), r(r) {}

Я получаю ошибку компиляции:

 illegal member initialization: 'Shape' is not a base or member

Так что я не был уверен, был ли мой код законным или даже наилучшей практикой. Или, если вместо этого у вас будет средний класс, просто делайте то, что делает класс Shape верхнего уровня

TwoDimensionalShape::TwoDimensionalShape(int x, int y) : Shape (x, y) {}

и затем в классе Круга

Circle::Circle(int x, int y, int r) : TwoDimensionalShape(x, y), r(r) {}

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Да, как вы указали в конце поста, ваш конструктор класса может вызывать только конструктор его непосредственного родителя, вы не можете "пропустить" классы и инициализировать родителя вашего родителя.

1 голос
/ 06 мая 2010

Для не виртуального наследования вы можете вызывать только конструктор вашего родительского класса.

Единственный раз, когда вы строите прародителя (или прадеда и т. Д.), Это виртуальное наследование.

0 голосов
/ 06 мая 2010

Конструктор для класса Shape2d должен вызывать конструктор для Shape. Конструктор для Circle должен вызывать конструктор для Shape2d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...