Да вы, батенька, король контента!
Эт шутка. Хоть и не смешная для самоделкиных из области геймдева. :)
Так, а кроме шуток. Не надо вообще так делать. Тип наносимого урона/снаряда/юнита/орудия никогда не должен описываться его собственным классом. Все юниты должны быть одного класса, все пули - тоже, все здания - тоже.
У тебя должен быть только набор общих классов для сущностей. Конкретные параметры (что откуда вылетает, как дамажит и как это все визуально выглядит) должны лежать в ресурсах.
Рекомендую почитать:
habrahabr.ru/post/255561 Изложенное куда более важно для области любимых самокатов на С++.
Хотя... Если тебе так надо реализовать на классах, а не на ресурсах, то тебе надо просто организовать фактическую связь между сущностями. Давай предложу один страшный вариант... Дебажить это все чур самому.
class TowerParent
{
public:
// Это тип для той штуки, которая будет создавать нам нужную боеголовку.
typedef FireParent* (*FireConstructor)( float, float, int, float, float, float );
TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
//...
FireParent* towerFire;
protected:
FireConstructor fire_constructor; // инстанция конструктора боеголовок.
// Вот так мы будем определять тип конструируемой боеголовки.
template< class fire_t >
inline void DefineFireType(){
fire_constructor = TowerParent::template MakeFire<fire_t>;
};
private:
// А вот так мы будем конструировать боеголовку.
template< class fire_t >
static FireParent* MakeFire( float _x, float _y, int _speed, float _angle, float _targetX, float _targetY ){
return new fire_t( _x, _y, _speed, _angle, _targetX, _targetY );
};
};
SimpleTower( int _col, int _row, float _posX, float _posY, float _attackRange, float _angle ){
DefineFireType<Bullet>();
};
RocketTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle){
DefineFireType<Rocket>();
};
Конструирование делается через:
towerFire = fire_constructor( .... );
Еще одна поправка. Не Rocket, а Missile.
Потому что ... :)
UPD:
Еще один вариант, уже менее страшный - это шаблонизация базового класса:
template< class fire_t >
class TowerParent
{
public:
TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
//...
fire_t* towerFire;
protected:
inline fire_t* MkeFire( float _x, float _y, int _speed, float _angle, float _targetX, float _targetY ){
return new fire_t( _x, _y, _speed, _angle, _targetX, _targetY );
};
};
class Bullet : public FireParent<Bullet>
{
public:
Bullet(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};
class Rocket : public FireParent<Rocket>
{
public:
Rocket(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};