使用Derived类和Base类的std :: shared_ptr

jnb*_*mez 6 c++ shared-ptr c++11 c++14

以下方法是否良好?

class TA      {  };
class TB : TA {  };

std::shared_ptr<TA> spta;
spta.reset(new TB);
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 5

显示的代码有一个问题,TB必须从TA. 您有一个shared_ptr<TA>,因此您要存储在其中的指针必须可转换为TA,但通过private继承,基类无法访问,因此您的代码将无法编译。

class TA             {  };
class TB : public TA {  };
Run Code Online (Sandbox Code Playgroud)

除此之外,代码没有错误并且表现良好。通常,当您通过基类指针执行派生类实例的多态删除时,您需要基类的析构函数,以便virtual调用派生类析构函数,但在shared_ptr这种情况下则不需要。shared_ptr::reset是一个函数模板,它将接受任何Y*可转换为托管指针类型的函数模板。shared_ptr构造函数模板也是如此。

话虽这么说,您应该更喜欢创建基类的析构函数virtual,特别是当涉及的类具有其他virtual功能时。


sky*_*ack 2

不,这不是TA私人的。

此外,正如评论中所建议的,基类的析构函数应该是virtual。这通常是一个很好的做法,因为您不能保证类的实例仅与共享指针一起使用。

要使其正常工作,您至少必须修改以下行:

class TA {  };
class TB : TA {  };
Run Code Online (Sandbox Code Playgroud)

如下:

class TA { virtual ~TA() { } };
class TB : public TA {  };
Run Code Online (Sandbox Code Playgroud)

这些都很好,因为下面的例子很好

class TA { virtual ~TA() { } };
class TB : public TA {  };

TA *spta = nullptr;
spta = new TB;
Run Code Online (Sandbox Code Playgroud)

这主要取决于好的对你来说意味着什么。至少这是合法的。

  • @RichardHodges `shared_ptr` 不需要,但无论如何都是个好主意。 (2认同)