shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类相关的知识,希望对你有一定的参考价值。

[我试图了解我对shared_ptrshared_from_this()的工作方式以及内存分配的工作方式是否是最新的了解。

以下是我的课程:

class Component : public enable_shared_from_this <Component>
{

public:
    Component() :enable_shared_from_this(){}

};

class DerivedComponent : public Component
{
public:

    DerivedComponent()
    {}

    void tryDerivedShared()
    {
        auto sptr1 = shared_from_this();
        if (this == sptr1.get())
            std::cout << "Both have same starting address";

    }

private:
    std::vector<int> myVector;
};

int main()
{

    auto sptr = make_shared<DerivedComponent>();
    sptr->tryDerivedShared();

}

当我从基类派生时,我了解的是,首先为基分配内存,然后为派生分配内存。因此,当我执行auto sptr1 = shared_from_this();时,会发生什么事shared_ptr返回给基类Component的对象。并且由于基数是Derived类的内存的一部分,因此this == sptr1.get()的值为true,因为它们两个都返回它们指向的obj的起始内存。基本上,分配的内存类似于| Base | Derived |。 shared_from_this()返回仅指向Base对象的shared_ptr,即| Base |。内存块。

我的理解正确吗?

答案

将这些类视为结构可能会更容易。仅您的基类为空,因此可能不是最佳示例。

struct Component
{
};

当您派生时,实际上是将字段添加到结构中,但是您可能希望以这种方式查看它:

struct DerivedComponent
{
    struct Component    component_;
    std::vector<int>    myVector;
};

因此,您是正确的,当您分配DerivedComponent时,Component(或&obj.component_)的地址都相同,这就是为什么您可以在两者之间使用static_cast<>()

变得更复杂的地方是当您从许多类派生时,尤其是使用virtual关键字时。另一方面,拥有虚函数并不太复杂,它会在开始时添加一个虚表指针,但是就您所担心的隐藏指针而言。

enable_shared_from_this()不会更改该概念。它只是向Component结构添加了一个弱指针。因此Component类看起来更像这样:

struct Component
{
    struct enable_shared_from_this   shared_;
};

以上是关于shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类的主要内容,如果未能解决你的问题,请参考以下文章

如何影响派生类中受保护的基变量

如何在 TypeScript 的派生类中进行构造函数重载?

如何在具有相同函数名的派生类中调用基类的函数[重复]

如何在 C++ 中访问派生类中的变量?

派生类中的抽象方法覆盖,如何使私有

如何在 CWinThread 派生类中正确创建 CDialog 框