[c++]dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数

//编译错误
#include <memory>
#include <iostream>

class base{
 public:
    base(){std::cout << "base" << std::endl;}
    ~base(){std::cout << "~base" << std::endl;}
    void print(){std::cout << "base::print" << std::endl;}
};

class derived:public base{
 public:
    derived(){std::cout << "derived" << std::endl;}
    ~derived(){std::cout << "~derived" << std::endl;}
    void print(){std::cout << "derived::print" << std::endl;}
};

int main()
{
    std::shared_ptr<base> b_ptr = std::make_shared<derived>();
    b_ptr->print();
    auto d_ptr = std::dynamic_pointer_cast<derived>(b_ptr);
    d_ptr->print();
    return 0;
}
//变异运行正常
#include <memory>
#include <iostream>

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

class derived:public base{
 public:
    derived(){std::cout << "derived" << std::endl;}
    ~derived(){std::cout << "~derived" << std::endl;}
    void print(){std::cout << "derived::print" << std::endl;}
};

int main()
{
    std::shared_ptr<base> b_ptr = std::make_shared<derived>();
    b_ptr->print();
    auto d_ptr = std::dynamic_pointer_cast<derived>(b_ptr);
    d_ptr->print();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/adream307/article/details/81607414