在此计划中: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,也会有一个例子
答案 0 :(得分:2)
智能指针在这方面应该像常规原始指针 。使用原始指针,您可以使用如下所示的函数foo()
:
void foo(B* pBase);
并且 - 给定一个派生自D
的课程B
- 向其传递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
时,此转换构造函数才会实际参与重载决策。 §C++ 11标准的20.7.2.2.1 / 17规定:
需要:第二个构造函数不应参与重载决策,除非
Y*
是隐含的 可转换为T*
。
这通常通过在函数模板上使用SFINAE约束来实现。
答案 1 :(得分:1)
当且仅当<{p>
时,才会从shared_ptr<T>
到shared_ptr<U>
进行隐式转换(通过非显式构造函数)
U
是void
或U
是T