gpt4 book ai didi

c++11 - 如何使用 std::shared_ptr 实现多态性?

转载 作者:行者123 更新时间:2023-12-03 06:31:48 29 4
gpt4 key购买 nike

我已经看到了有关此主题的一些其他问题,但仍然没有找到答案 - 我想我错过了一些东西:

我定义了两个简单的测试类:

class TestBase
{

public:

TestBase ( ) { };
~ TestBase ( ) { };

protected:

inline virtual int getInt ( )
{
return 0;
}

};

class TestDerived : public TestBase
{

protected:

inline int getInt ( ) override
{
return 1;
}

};

我声明了 typedef 以简化其使用 std::shared_ptr:

typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;

问题:我无法编译代码以多态地使用这些 shared_ptr 声明,即使在所有这些情况下 base 实际上是 spDerived 的实例:

spBase base;
spDerived derived = static_cast < spDerived > ( base );

error: no matching function for call to ‘std::shared_ptr::shared_ptr(spBase&)

spDerived derived = dynamic_cast < spDerived > ( base );

error: cannot dynamic_cast ‘base’ (of type ‘spBase {aka class std::shared_ptr}’) to type ‘spDerived {aka class std::shared_ptr}’ (target is not pointer or reference)

spDerived derived = static_pointer_cast < spDerived > ( base );

error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested

spDerived derived = dynamic_pointer_cast < spDerived > ( base );

error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested

我在带有默认 GCC 工具链的 Ubuntu 14.04 机器上使用 C++11。编译器是gcc-4.9。我究竟做错了什么?不能多态地使用shared_pointer吗?

最佳答案

传入 std::static_pointer_cast 的类型和 std::dynamic_pointer_cast因为第一个类型模板参数是转换后的指针类型本身的类型,而不是智能指针类型:

static_pointer_cast<T>(arg);
.~~~^
v
template <class T, class U>
.~~~~^
v
shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r);


dynamic_pointer_cast<T>(arg);
.~~~~^
v
template <class T, class U>
.~~~~^
v
shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r);

话虽如此,您可以像下面这样调用它:

spBase base = std::make_shared<TestDerived>();
spDerived derived = std::dynamic_pointer_cast<spDerived::element_type>(base);
// or:
spDerived derived2 = std::dynamic_pointer_cast<TestDerived>(base);

关于c++11 - 如何使用 std::shared_ptr 实现多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27502968/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com