是否可以使用共享指针调用虚方法?

Is it possibile to call virtual methods with shared pointers?

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

class Derived : public Base {
public:
    void f() const { std::cout << "Derived::f()" << std::endl; }
};

int main()
{
    Base* obj = new Derived;
    std::shared_ptr<Base> sp = std::make_shared<Base>(*obj);
    sp->f();  //prints Base::f()
}

我期望的是 sp->f() 打印 Derived::f(),就像使用虚拟方法的原始指针一样。 使用 std::shared_ptr 进行多态行为的正确方法是什么?

sp 指向类型 Base 的实例,而不是 Derived。您不能像这样使用指向基的指针克隆派生 类。

std::shared_ptr<Base> sp = std::make_shared<Derived>(); 可以。 ... =std::make_shared<Derived>(std::dynamic_cast<Derived&>(*obj)) 也可以;