1

在这个程序中: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_ptrtochat_session被发送到该join方法
room_.join(shared_from_this());

定义为

  void join(chat_participant_ptr participant)

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

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

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

- -编辑 - -

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

4

2 回答 2

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 约束来实现。

于 2013-05-28T14:20:07.497 回答
1

shared_ptr<T>存在从到shared_ptr<U>当且仅当的隐式转换(通过非显式构造函数)

  • Uvoid
  • U是一个可访问的基类T
于 2013-05-28T14:19:07.070 回答