Можете ли вы иметь общий указатель родительского класса, возвращающий тип функции, а затем возвращать новый дочерний класс, не являясь общим указателем? Я не уверен, как общие указатели работают в этих ситуациях, они действуют как обычный указатель? Вот мой пример:
BaseEventPtr Actions::getEvent(const std::string& nodeName)
{
if(asLowerCaseString(nodeName) == "action")
return new ActionEvent(&m_interface);
return nullptr;
}
ActionEvent является подклассом BaseEvent в этой ситуации.
Ура!
Если BaseEventPtr
это умный указатель, все должно быть в порядке.
В основном вызовы общего указателя delete
на реальный указатель, когда больше нет ссылок. Если базовый класс имеет виртуальный деструктор определено, delete
вызывает деструктор соответствующего подкласса.
Например:
class NonVirtualBase {};
class NonVirtualSubclass: public NonVirtualBase {};
shared_ptr<NonVirtualBase> ptr( new NonVirtualSubclass() ); // NOT OK!
class VirtualBase
{
virtual ~VirtualBase() {}
};
class VirtualSubclass: public VirtualBase {};
shared_ptr<VirtualBase> ptr( new VirtualSubclass() ); // OK
Это относится и к обычным (голым) указателям. Поэтому, как правило, если в будущем класс может служить базовым классом, он должен быть определен с помощью виртуального деструктора (даже если он пустой).
Других решений пока нет …