是否可以使用共享指针调用虚方法?
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))
也可以;
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))
也可以;