У меня есть класс, который является производным от двух одинаковых оснований:В множественном наследовании от двух идентичных базовых классов, как бросить это один из тех
class Vector3d {...};
class Position:public Vector3d {...};
class Velocity:public Vector3d {...};
class Trajectory:public Position, public Velocity
{
Vector3d &GetPosition(void);
Vector3d &GetVelocity(void);
};
Я хотел бы иметь функции-членов в производном классе для быстрого броска на одну или другую базу. То, что я пытаюсь это:
Vector3d &GetPosition(void) const
{
return static_cast<const Vector3d &>(*this);
}
, но я получил любезное сообщение от компилятора: «Reference инициализируется с„сопзИте позициями“, нуждается в объекте типа" Vector3D»
Когда я использую:
const Vector3d &GetPosition(void) const
{
return static_cast<const Vector3d &>(*this);
}
вещи компилировать в порядке, но я не могу использовать его в том, что я намерен:
Trajectory t;
t.Position=Set(20,30,50);
потому t.Po sition является const и, следовательно, неправильным значением lvalue, как компилятор сообщает.
Любые идеи относительно того, как ссылаться на базовые классы из этого в не постоянное разыменование?
Не комментировать это отдельно, чтобы сказать, что дизайн здесь кажется чем-то неправильным. На самом деле легко попасть в беспорядок с наследованием. Предпочитают инкапсуляцию. Тогда проблема полностью исчезает. – Robinson
вы уверены? вы сталкиваетесь с проблемой «Diamond issue», чтобы проверить, объявляет ли она переменную-член в базовом классе 'Vector3d', а затем вызывает ее из функции участника Trajectory. поэтому используйте виртуальное наследование. – Raindrop7
@ Raindrop7: НЕ используйте виртуальное наследование здесь. Это похоже на проблему с алмазом, но обратите внимание, что для позиции + скорости крайне важно, чтобы эти vector3d оставались на 100% раздельными. –