std::shared_ptr 和继承
Posted
技术标签:
【中文标题】std::shared_ptr 和继承【英文标题】:std::shared_ptr and Inheritance 【发布时间】:2014-08-27 12:07:54 【问题描述】:在继承类的shared_ptr
之间进行自动类型转换时遇到了一些问题。
我的类结构如下,一个基类Base
和两个派生类Derived1
和Derived2
。
// Base class
class Base
protected:
...
...
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
...
...
;
// Derived class
class Derived1: Base
protected:
...
...
public:
Derived1() = default;
virtual ~Derived1() = default;
void run() ...
...
...
;
// Derived class
class Derived2: Base
protected:
...
...
public:
Derived2() = default;
virtual ~Derived2() = default;
void run() ...
...
...
;
我有一个函数doSomething()
void doSomething(std::shared_ptr<Base> ptr)
ptr->run();
...
我像这样用派生类调用函数-
doSomething(make_shared<Derived1>())
doSomething(make_shared<Derived2>())
但我收到一条错误消息 -
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
我做错了什么?仅将 static_pointer_cast
用于 Base 类型是否安全?喜欢-
doSomething(static_pointer_cast<Base>(make_sahred<Derived2>()))
解决方案 我的错...问题是我私下继承了基类。
【问题讨论】:
【参考方案1】:据我所知,您提供的代码编译良好:http://ideone.com/06RB2W
#include <memory>
class Base
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
;
class Derived1: public Base
public:
Derived1() = default;
virtual ~Derived1() = default;
void run()
;
class Derived2: public Base
public:
Derived2() = default;
virtual ~Derived2() = default;
void run()
;
void doSomething(std::shared_ptr<Base> ptr)
ptr->run();
int main()
doSomething(std::make_shared<Derived1>());
doSomething(std::make_shared<Derived2>());
【讨论】:
对不起我的错...我在我的代码中私下继承了这个类!这真是一个菜鸟的错误! shared_ptr 是否自动(没有任何类型转换)转换为基类 shared_ptr?它们是否共享相同的引用计数? 它不会自动类型转换,但是如果你手动转换它,那么引用计数是共享的。 在您的代码中您没有手动键入 cast,所以他们共享引用计数吗?以上是关于std::shared_ptr 和继承的主要内容,如果未能解决你的问题,请参考以下文章
`std::optional` 比 `std::shared_ptr` 和 `std::unique_ptr` 有啥优势?
使用相同的函数但重载不同的 std::tr1::shared_ptr<T> 和 std::shared_ptr<T>