按值传递共享指针并接受作为基类参数是如何工作的
how does passing shared pointer by value and accepting as base class argument work?
在这个程序中:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp
class chat_session
: public chat_participant,
chat_session继承chat_participant
在shared_ptr
到chat_session
的一次调用中,被发送给join
方法room_.join(shared_from_this());
定义为
void join(chat_participant_ptr participant)
那么上面的例子如何转化为particpant
是继承类实例的基类指针?
我对基类指针指向继承类实例的理解是来自虚成员这里的例子
http://www.cplusplus.com/doc/tutorial/polymorphism/——编辑——
如果有人能解释一下,即使我们不使用shared_ptrs
智能指针在这方面应该像普通的原始指针。使用原始指针,您可以拥有如下所示的函数foo()
:
void foo(B* pBase);
并且给定一个从B
派生的类D
,传递一个类型为D*
的指针给它:
class D : public B { ... };
// ...
D obj;
foo(&obj); // OK!
这就是派生到基的转换是如何工作的,也是多态性的基础。现在,智能指针旨在模仿这种机制,因此给定:
void foo(shared_ptr<B> pBase);
你可以这样做:
shared_ptr<D> pObj = make_shared<D>();
foo(pObj); // OK!
从技术上讲,shared_ptr
类模板实现这种行为的方式是有一个用户定义的构造函数模板来执行隐式转换:
template<class T> class shared_ptr {
public:
// ...
template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
// ...
};
只有当Y
可转换为T
时,这个转换构造函数才会真正参与重载解析。§20.7.2.2.1/17的c++ 11标准规定:
要求:除非
Y*
是隐式的,否则第二个构造函数不参与重载解析可转换为T*
.
这通常通过在函数模板上使用SFINAE约束来实现。
当且仅当
存在从shared_ptr<T>
到shared_ptr<U>
的隐式转换(通过非显式构造函数)-
U
是void
或 -
U
是T
的可访问基类
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?