Я хочу реализовать иерархию наследования в своем движке на С++, который имеет некоторые аналоги с Java:
- все объекты наследуются от класса
Object
, - некоторые функции предоставляются интерфейсами.
Это просто аналогия, которая дает мне некоторые преимущества ( не строковое сопоставление Java: С++ 1:1, что невозможно).
Под "интерфейсом" я подразумеваю здесь класс с только чистыми виртуальными, общедоступными методами. Я знаю, что это не строгое и точное его определение.
Итак, я сделал:
class Object{...};
/* interfaces */
class Nameable : public Object{...};
class Moveable : public Object{...};
class Moveable3D : public Moveable{...};
class Moveable2D : public Moveable{...};
class Model3D : public Moveable3D, public Nameable{...}
class Line3D : public Moveable3D{...}
class Level: public Nameable{...}
class PathSolver : public Object{...}
Как вы можете видеть, Model3D
теперь наследует от Object
несколькими способами:
-
Moveable3D -> Moveable -> Object
, -
Nameable -> Object
.
И мой компилятор в VS2013 (VС++) предупреждает меня об этом.
Это проблема?
Если да, то как его решить, чтобы получить лучшую структуру наследования?
Я думал о двух путях, но у обоих есть больше недостатков, чем преимущества:
- Удаление наследования между, например,
Nameable
иObject
. Но таким образомLevel
тоже потерял бы свое наследование отObject
(и моя первая цель была: все объекты наследуются от классаObject
). - Я мог бы также удалить
: public Object
из каждого интерфейса. Но таким образом я был бы вынужден вручную набирать:public Object
в каждом из многих конечных классов двигателей (Model3D
,Line3D
,Level
,PathSolver
). Таким образом, рефакторинг и создание новых конечных типов будет сложнее. Кроме того, информация о том, что каждый интерфейс будет гарантированно наследоваться отObject
, теряется таким образом.
Я бы хотел избежать виртуального наследования (еще один уровень абстракции) , если он не нужен. Но может быть, это (по крайней мере, для : public Object
)?