2017-01-21 2 views
0

У меня есть 3 класса MovableObject, FixedObject и CollisionObject. A CollisionObject должен иметь возможность быть либо MovableObject, либо FixedObject. Но было бы бессмысленно использовать множественное наследование, поскольку оно не может быть одновременно одновременно. В принципе, если я создаю Projectile, иерархия будет:Измените то, что наследует производный класс от

Sprite <- MovableObject <- CollisionObject <- Projectile 

И если я создаю Obstacle было бы:

Sprite <- FixedObject <- CollisionObject <- Obstacle 

(Мой базовый класс Sprite)

Так что CollisionObject следует наследовать от того, на что наследуются дочерние объекты (Либо Movable-, либо FixedObject). Но как это реализовать на C++?

+1

«Но я не могу наследовать от обоих классов конечно» Почему нет? –

+1

«Но я не могу унаследовать оба эти класса». -> на самом деле, __you can__. Это называется [множественное наследование] (http://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/). – ForceBru

+0

@latedeveloper хорошо, если я делаю CollisionObject: public FixedObject, public MovableObject не создаст экземпляр обоих? – Bonbin

ответ

2

Если CollisionObject класс, то он всегда будет наследовать от одних и тех же классов, так, что вы запрашиваете не возможно, если вы не хотите использовать множественное наследование. Но множественное наследование сделает CollisionObject подвижным и фиксированным, что звучит не очень правильно.

Однако, если вы сделаете CollisionObject шаблон, это может быть сделано:

template<typename Base> class CollisionObject : public Base 
{ 
    ... 
}; 

class Projectile : public CollisionObject<MovableObject> {...}; 
class Obstacle : public CollisionObject<FixedObject> {...}; 
+0

@Quentin Вы правы, я неправильно понял наследство в вопросе. Исправлено. –

2

Отказ от ответственности: полезность этого ответа будет сильно различаться в зависимости от остальной части вашего дизайна.

Это сказал: «CollisionObject должен иметь возможность быть либо MovableObject или FixedObject» не звучит, как вам нужно CollisionObject, чтобы как-то переключить его базовый класс, но вместо того, чтобы быть базового класса.

struct CollisionObject { }; 
struct MovableObject : CollisionObject { }; 
struct FixedObject : CollisionObject { }; 
+0

Я забыл упомянуть, что у меня есть Sprite в качестве базового класса, и что объект, который не нуждается в столкновении, наследует непосредственно из подвижного или fixedObject. Спасибо за ответ – Bonbin

+0

@Bonbin, так что «подвижность» и «сталкиваемость» объекта являются ортогональными свойствами - к сожалению, это невозможно смоделировать с иерархией классов ООП. Рассмотрите состав или политический дизайн. – Quentin

+0

хорошо, спасибо, что указал мне в правильном направлении. – Bonbin