我有一个类层次结构,其中B
从A
继承,如下所示:
class A : public std::enable_shared_from_this<A>
{
};
class B : public A
{
void f()
{
// the code below compiles
std::shared_ptr<B> copyOfThis = std::static_pointer_cast<B>(shared_from_this());
// the code below does not
std::shared_ptr<B> copyOfThis = static_cast<std::shared_ptr<B>>(std::make_shared<A>(shared_from_this()));
}
};
实际上,我想了解为什么不能使用 static_cast
将父类的 shared_ptr
转换为子类的 shared_ptr
,即使它实际上包含了子类的 this
。
编辑:请参考此问题:Polymorphic smart pointer usage。在这里,我询问为什么可以在父类的共享指针上强制转换子类的共享指针。答案是有一个模板构造函数。详情请参见问题描述。那么为什么即使shared_ptr<A>
和shared_ptr<B>
之间没有关系,这个构造函数也不能用于转换呢?
std::make_shared
分配一个新的托管对象,与*this
不同。 - interjaystd::make_shared<A>(shared_from_this())
是用来干什么的?你有尝试编译这段代码吗?这可能会回答你的问题。 - Jonathan WakelyB *
可以隐式转换为A *
,但是A *
不能隐式转换为B *
。因此,构造函数不参与重载决议。 - 5gon12eder