Как решить проблему с ООП?
Да вы, батенька, король контента!
Эт шутка. Хоть и не смешная для самоделкиных из области геймдева. :)
Так, а кроме шуток. Не надо вообще так делать. Тип наносимого урона/снаряда/юнита/орудия никогда не должен описываться его собственным классом. Все юниты должны быть одного класса, все пули - тоже, все здания - тоже.
У тебя должен быть только набор общих классов для сущностей. Конкретные параметры (что откуда вылетает, как дамажит и как это все визуально выглядит) должны лежать в ресурсах.
Рекомендую почитать: 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:
};
Шаблоны?