簡體   English   中英

來自 std::enable_shared_from_this 的 Inheritance

[英]Inheritance from std::enable_shared_from_this

我有下一個代碼:

class A 
{
    virtual ~A() = default;
    virtual void foo1() = 0;
};
class B
{
    virtual ~B() = default;
    virtual void foo2() = 0;
};

class C: public A, public std::enable_shared_from_this<C>, public B
{
    void foo1() override
    {
    }

    void foo2() override
    {
    }
};

class std::enable_shared_from_this 在 class B 之前是否正確? std::enable_shared_from_this 在哪里重要嗎?

std::enable_shared_from_this在哪里重要嗎?

從技術上講,這並不重要。

派生順序會影響構造函數和析構函數調用的順序。

  • 從構造的角度來看, enable_shared_from_this<T>構造函數是無操作的; 它只是向 class 添加一個值初始化的,即空的, weak_ptr -to-self,並由shared_ptr<T>構造函數檢測,該構造函數在 object 完全構造立即將自身分配給該成員。

  • 從破壞的角度來看,即使在它拋出之前之后另一個基地的析構函數也無關緊要。 析構函數仍將被調用,並且相應的shared_ptr的弱計數器(如果有)將被適當地遞減,以便在時機成熟時釋放它(對於真正好奇的,可以在此處找到異常清理規則)。

然而,從代碼風格的角度來看,這可能很重要。 例如,以下聲明可以說更具可讀性:

class C: public A, public B, public std::enable_shared_from_this<C>
. . .

不要緊。

基類的順序可能會影響:

  • 構造順序(先基在前,虛繼承除外)
  • Memory 布局順序(不確定,可能不影響)

所以,只有施工順序很重要。

但是無論如何,您都不能在基本 class 構造函數/析構函數中使用 shared_from_this 。

即使在當前 class 的構造函數或析構函數的主體中也不能使用它,因為它會拋出異常,直到它被放置在shared_ptr<C>shared_ptr<D>中,無論如何。 而且您甚至沒有簡單的方法從基礎 class 嘗試shared_from_this ,因為您不能從基礎 class 的構造函數調用虛擬函數,就像調用派生實現的方式一樣。

所以根本沒關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM