gpt4 book ai didi

c++ - 按值传递共享指针并作为基类参数接受是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 02:54:52 29 4
gpt4 key购买 nike

在这个程序中: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,那将是一个很好的例子

最佳答案

在这方面,智能指针应该表现得像普通的原始指针。使用原始指针,您可以拥有如下所示的函数 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 时,此转换构造函数才会实际参与重载决策。 C++11 标准的 § 20.7.2.2.1/17 规定:

Requires: The second constructor shall not participate in the overload resolution unless Y* is implicitly convertible to T*.

这通常是通过在函数模板上使用 SFINAE 约束来实现的。

关于c++ - 按值传递共享指针并作为基类参数接受是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794332/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com