如何通过值传递共享指针并接受作为基类参数工作?

时间:2013-05-28 14:13:11

标签: c++ inheritance boost polymorphism shared-ptr

在此计划中: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_ptrchat_session的一个来电中,join方法发送了

room_.join(shared_from_this());

定义为

  void join(chat_participant_ptr participant)

那么上面的例子如何转换为particpant作为继承类实例的基类指针?

我对继承类实例的基类指针的理解来自虚拟成员 这里的例子

http://www.cplusplus.com/doc/tutorial/polymorphism/

--- ---编辑

如果有人可以解释如何在函数参数中定义指向基类的指针,即使我们不使用shared_ptrs,也会有一个例子

2 个答案:

答案 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>进行隐式转换(通过非显式构造函数)
  • Uvoid
  • UT
  • 的可访问基类