【问题标题】:Returning new base class when the parent class shared pointer is the return type当父类共享指针为返回类型时返回新的基类
【发布时间】:2012-10-03 11:17:05
【问题描述】:

你能有一个父类共享指针返回一个函数的类型,然后返回一个新的子类而不是一个共享指针吗?我不确定共享指针在这些情况下是如何工作的,它们是否像普通指针一样工作?这是我的例子:

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

    return nullptr;
}

ActionEvent 在这种情况下是 BaseEvent 的子类。

干杯!

【问题讨论】:

  • 听说过factory pattern吗?也许这会给你一些你真正想要的想法。
  • 是的,我听说过,会研究它以改进我正在开发的当前系统,干杯。

标签: c++ pointers shared base derived


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2015-11-03
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2022-01-03
    • 2021-01-11
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多