Вы, очевидно, хотите использовать полиморфизм (поскольку вы хотите поместить производный класс, где ожидается только базовый класс).
Но каждый раз, когда вы хотите использовать полиморфизм, у вас должен быть автомат для использования указателя на базу (ссылка на базу также работает, если я правильно помню). Предполагая, что childgoal публично наследует от цели, следующие утверждения верны:
- детская цель является целью
- указатель на цель может указывать на цель или дочернюю цель (или на любой производный класс)
- но цель экземпляр is-NOT-a childgoal
Таким образом, в принципе, если бы вы смогли трансформировать свою дочернюю цель в цель (, что здесь невозможно, поскольку вы пытаетесь создать экземпляр абстрактного класса ), вы бы избавились от всех присутствующих дополнительных членов в детской, тем самым теряя свой первоначальный объект. Я думаю, что это не было твоим намерением.
Если вы боитесь проблемы управления памятью, которая может возникнуть при использовании классических указателей, вы можете рассмотреть возможность использования shared_pointers здесь:
abstract class goal;
class priority;
class childgoal : public goal;
typedef std::tr1::shared_ptr<goal> goalPtr; //sadly I think std::tr1 is not a multiplatform namespace
multimap<priority, goalPtr> mm;
goalPtr tmpChildGoal(new childgoal()); //always use named shared pointer !
mm.insert(make_pair(priority(), tmpChildGoal);