什么更适合用于向下转换boost :: polymorphic_pointer_downcast或boost :: dynamic_pointer_cast

时间:2017-04-18 21:35:10

标签: c++ boost casting downcast

我将在我的项目中使用向下转换以投射一个boost :: shared_ptr<>在类层次结构中的另一个。这是我的测试代码,我使用boost/polymorphic_pointer_castboost::dynamic_pointer_cast两种变体工作。但我不明白他们之间有什么区别。你能描述一下boost::polymorphic_pointer_downcastboost::dynamic_pointer_cast之间的区别吗?

namespace cast
{

class Base
{
public:
    virtual void kind() { std::cout << "base" << std::endl; }
};

class Derived : public Base
{
public:
    virtual void kind2() { std::cout << "derived" << std::endl; }
};

}

int main(int argc, char* argv[])
{
    try
    {
        boost::shared_ptr<cast::Base> base(new cast::Derived());
        base->kind();

        boost::shared_ptr<cast::Derived> d1 = boost::polymorphic_pointer_downcast<cast::Derived>(base);
        d1->kind();
        d1->kind2();

        boost::shared_ptr<cast::Derived> d2 = boost::dynamic_pointer_cast<cast::Derived>(base);
        d2->kind();
        d2->kind2();
    }
    catch (const std::exception& e)
    {
        std::cerr << "Error occurred: " << e.what() << std::endl;
    }

    return 0;
}

感谢。

1 个答案:

答案 0 :(得分:2)

根据docs,多态下击与静态下转相同,BUT是在调试模式下检查额外的运行时类型:

  

C ++内置的static_cast可以用于有效地向下转换指向多态对象的指针,但是对于正在转换的指针实际指向错误的派生类的情况不提供错误检测。 polymorphic_downcast模板保留了非调试编译的static_cast效率,但是对于调试编译,通过assert()增加了dynamic_cast成功的安全性

合乎逻辑的结果是

  

对于您确定应该成功的向下广播,应使用polymorphic_downcast

否则,请使用boost::dynamic_pointer_cast

(请注意,*_pointer_*cast版本仅为智能指针类型添加了通用性,但上述文档对这些版本的应用不变。)