假设DerivedClass是从BaseClass派生的
以下工作有效吗?

boost::shared_ptr<BaseClass> a(new BaseClass());
boost::shared_ptr<DerivedClass> b(new DerivedClass());
a=b;

在这个question之后,我知道现在a指向派生的,而b指向基数(对吗?)

另外,现在,如果我通过a调用一个函数,它将调用派生的实现吗?

最佳答案

...
a=b;

您将重新分配给a,因此a b现在都指向DerivedClass对象。 BaseClass对象将被销毁,因为此时它的引用计数为零(由于a被重新分配为指向另一个对象)。

由于a现在指向DerivedClass对象,因此通过BaseClass进行的虚函数调用(在DerivedClass中定义并在a中覆盖)将在DerivedClass中调用相应的成员函数。

ab都超出范围时,DerivedClass对象将被销毁。

如果您需要通过a访问特定于派生类的函数(例如DerivedClass中的非虚拟函数),则可以使用:
boost::dynamic_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass();

当然,这只是显示用法的简洁示例。在生产代码中,几乎可以肯定的是,在取消引用指针之前,必须测试是否成功将其转换为DerivedClass

关于c++ - boost::shared_ptr并分配派生类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5134025/

10-10 13:42