c++ - boost::shared_ptr 和分配派生类

标签 c++ boost variable-assignment shared-ptr

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

相关文章:

c++ - Visual Studio 中的 lcr 游戏 C++ LINK 2019 错误

java - 如何使用 java.nio.ByteBuffer 从 C++ 返回到 Java

c++ - 将 Boost Spirit 解析器从 boost::variant 转换为 std::variant

c++ - 如何使用 boost 程序选项配置文件中的部分

引号中的 Python 变量值

python - 输出 : functions vs. 分配给变量的函数

c++ - 为什么 std::size_t 在 32 位系统上是 4 个字节,而 unsigned long long 在 32 位和 64 位系统上都是 8 个字节?

c++ - 从函数指针创建 boost::function 的跨平台方式

regex - Perl 将正则表达式匹配分配给具有默认值的变量

c++ - 在 C++ 中赋予回调函数访问类数据成员的权限