Возврат нового базового класса, когда общий указатель родительского класса является возвращаемым типом

Можете ли вы иметь общий указатель родительского класса, возвращающий тип функции, а затем возвращать новый дочерний класс, не являясь общим указателем? Я не уверен, как общие указатели работают в этих ситуациях, они действуют как обычный указатель? Вот мой пример:

BaseEventPtr Actions::getEvent(const std::string& nodeName)
{
if(asLowerCaseString(nodeName) == "action")
return new ActionEvent(&m_interface);

return nullptr;
}

ActionEvent является подклассом BaseEvent в этой ситуации.

Ура!

4

Решение

Если 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

Это относится и к обычным (голым) указателям. Поэтому, как правило, если в будущем класс может служить базовым классом, он должен быть определен с помощью виртуального деструктора (даже если он пустой).

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector