你有一个父类共享指针返回类型的函数,然后返回一个新的子类,而不是一个共享指针?我不确定共享指针在这些情况下是如何工作的,它们是否像常规指针一样?这是我的例子:
BaseEventPtr Actions::getEvent(const std::string& nodeName)
{
if(asLowerCaseString(nodeName) == "action")
return new ActionEvent(&m_interface);
return nullptr;
}
在这种情况下,ActionEvent是BaseEvent的子类。
干杯!
答案 0 :(得分:2)
如果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
这也适用于普通(裸)指针。这就是为什么作为一般规则,如果一个类在将来可以作为基类,它应该用虚拟析构函数定义(即使是空的)。