2014-03-19 81 views
0

(注意,這是我的實際設計的過於簡單化了。)指針在基類構造函數派生類

考慮以下幾點:

class CParentA; 
class C_Child 
public: 
    C_Child(C_ParentB* parent) : m_parent(parent){}; 
    virtual ~C_Child(); 

    CParentB* m_parent; 

}; 

class C_ParentA : public C_Child 
{ 
public: 
    C_ParentA(C_GrandParent *gp) : C_Child(gp){}; 
    virtual ~C_ParentA(){}; 
} 

class C_ParentB 
{ 
public: 
    C_ParentB(){}; 
    virtual ~C_ParentB(){}; 
    void foo(){}; 

} 

class C_GrandParent : public C_ParentB, public C_ParentA 
{ 
public: 
    C_GrandParent() : C_ParentA(this){}; 
    virtual ~C_GrandParent(); 

} 


main() 
{ 
    C_GrandParent gp; 

    gp.m_parent->foo(); 
} 

似乎parentB的指針,發送到孩子的構造函數在創建祖父母時無效。我曾經想過,即使父母沒有完全構建,它的指針(this)仍然有效。我也曾嘗試將ParentB作爲存儲在grandparent中的指針,並在grandparent構造函數中動態創建對象。但是這顯然有相同的結果。

FWIW:這個目標:grandparent有很多parents,其中一些有children。一個child可能需要訪問另一個childparentuncle/cousin)。我曾想過,讓他們在一位家長的領導下能夠處理家庭成員之間的很多相互關係。在這種情況下,設置適當的指針似乎成了問題。

回答

0

首先,你不清楚你在問什麼,所以我只是想推測。你提出的設計不起作用,所以你必須要求替代品,但是你沒有提供你想要做什麼的信息。

二,當類A派生類B我們通常說B是基礎或父項,A是派生或子項。你使用相反的術語,這很混亂。

現在,我只假定中的CParentB* m_parent;應該指代相同的C_Child對象,查看爲CParentB。您不需要爲此存儲指針。給定一個C_Child& r引用或C_Child* p指針,你可以簡單地說分別

dynamic_cast<CParentB&>(r) 
dynamic_cast<CParentB*>(p) 

兩個以不同的方式將失敗r,p不指CParentB對象。使用dynamic_cast可以導航整個類層次結構,並在運行時檢查轉換是否有效。如果這些類不是多態的,則可以使用static_cast代替。

在任何情況下,請記住,在派生類的任何對象完全構建之前,其基礎需要先構建。因此在此之前,請避免以任何方式與部分構建的對象進行遊戲,例如將其方法調用爲虛擬方法。

+0

對於層次結構順序感到抱歉 - 我從我的實際設計中重新命名,並將事情顛倒過來。將'祖父母'視爲'容器',將'父母'視爲該容器內的對象,其中一些包含其他對象。容器內的各種對象也需要訪問其中的其他對象。這就是我想要的。我以爲我可以將'this'傳遞給'Container'對象給它中的所有對象。編譯好的時候,實際的指向'Container'的指針還沒有生效。而且,是的,正如你所指出的那樣,我確信在所有內容建成之前我不會使用該指針。 – user3182551

相關問題