假设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/