[英]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>
. . .
不要緊。
基類的順序可能會影響:
所以,只有施工順序很重要。
但是無論如何,您都不能在基本 class 構造函數/析構函數中使用 shared_from_this 。
即使在當前 class 的構造函數或析構函數的主體中也不能使用它,因為它會拋出異常,直到它被放置在shared_ptr<C>
或shared_ptr<D>
中,無論如何。 而且您甚至沒有簡單的方法從基礎 class 嘗試shared_from_this
,因為您不能從基礎 class 的構造函數調用虛擬函數,就像調用派生實現的方式一樣。
所以根本沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.