假设 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
中对应的成员函数。
当 a
和 b
都超出范围时,DerivedClass
对象将被销毁。
如果您需要通过a
访问特定于派生类的函数(例如,DerivedClass
中的非虚函数),您可以使用:
boost::dynamic_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass();
当然,这只是一个显示用法的简洁示例。在生产代码中,您几乎肯定会在取消引用指针之前测试是否成功转换为 DerivedClass
。
关于c++ - boost::shared_ptr 和分配派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134025/