当父类共享指针为返回类型时返回新的基类



您是否可以让父类共享指针返回函数的类型,然后返回一个新的子类而不将其作为共享指针?我不确定共享指针在这些情况下如何工作,它们是否像常规指针一样工作?这是我的例子:

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

这也适用于普通(裸)指针。这就是为什么作为一般规则,如果一个类将来可以用作基类,则应使用虚拟析构函数(即使为空)来定义它。

最新更新