Если у вас есть 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) {}