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)
显示的代码有一个问题,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功能时。
不,这不是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)
这主要取决于好的对你来说意味着什么。至少这是合法的。
| 归档时间: |
|
| 查看次数: |
1737 次 |
| 最近记录: |