【问题标题】:Can boost::smart_ptr be used in polymorphism?boost::smart_ptr 可以用于多态性吗?
【发布时间】:2011-06-13 10:10:59
【问题描述】:

boost::smart_ptr如scoped_ptr和shared_ptr可以用在多态中吗?

class SomeClass
{
public:
    SomeClass()
    {
        a_ptr.reset(new SubClass);
    }
private:
    boost::scoped_ptr<SuperClass> a_ptr;
}

【问题讨论】:

  • 我想是时候开始寻找循环引用了。 :)
  • @Jonathan:你的析构函数是虚拟的吗?
  • @Jonathan:virtual dtor 需要在基类中。 structclass 无关紧要。查看我更新的帖子。
  • 事实上,当使用shared_ptr时,即使基类析构函数不是虚拟的,你也几乎总是安全的。
  • @Philip - 不完全正确。 shared_ptr 构造函数除了一个类型为 T 的指针(T 是任何类型,而不是实例化 shared_ptr 所用的类型)之外,还接受一个“删除器”作为参数。此参数默认调用类型为 T 的指针的 delete(同样,构造函数的 T,而不是 ptr)。因此,只要您使用最派生的类型构造 shared_ptr ,即使没有虚拟析构函数,它也可以正常工作。如果你不...那么你只是在头骨底部刺伤了自己。

标签: c++ boost boost-smart-ptr


【解决方案1】:

我相信答案是肯定的; boost 指针的编码使得派生类在超类所在的任何地方都可以接受。

【讨论】:

    【解决方案2】:

    是的:

    #include <string>
    #include <iostream>
    using namespace std;
    #include <boost\shared_ptr.hpp>
    using namespace boost;
    
    
    class Foo
    {
    public:
        virtual string speak() const { return "Foo"; }
        virtual ~Foo() {};
    };
    
    class Bar : public Foo
    {
    public:
        string speak() const { return "Bar"; }
    };
    
    int main()
    {
        boost::shared_ptr<Foo> my_foo(new Bar);
        cout << my_foo->speak();
    }
    

    输出为:Bar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2022-01-10
      相关资源
      最近更新 更多