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

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

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

    return nullptr;
}

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

Ваше здоровье!


person Ben Dol    schedule 12.10.2012    source источник
comment
Вы когда-нибудь слышали о шаблоне factory? Может быть, это даст вам некоторые идеи, что вы действительно хотите.   -  person Christian Ivicevic    schedule 12.10.2012
comment
Да, я слышал об этом, рассмотрю его для модернизации текущих систем, над которыми я работаю, Ура.   -  person Ben Dol    schedule 12.10.2012


Ответы (1)


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

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

person Alex    schedule 12.10.2012