2012-04-13 39 views
-1
struct BaseType 
{ 
    int x1; 
    float x2; 
}; 

struct ChildType 
{ 
    int y1; 
    float y2; 
}; 

Class Base  
{    
    BaseType obj;   

    void funcBase(BaseType **ptr) 
    { 

     *ptr = &obj;     // When this assignment happens ofcourse obj is of the BaseType as the LHS ptr is pointing to a BaseType            

    Now I want to write a C++ equivalent code of the following 2 algorithmic statements,          

     BaseType's obj.x1 = ChildTypes's obj.y1;      
     BaseType's obj.x2 = ChildTypes's.obj.y1;     


    }    
}; 

class Child :: public Base 
{ 
    ChildType obj; 

}; 

我wnat從基地獲得孩子的obj.y1並將其分配給基地的obj.x1。如何訪問子類的數據成員當兩個基地和子類有相同的對象名稱,但不同的類型。在C++

但是1件事情要記住,在基地和兒童的對象名稱是相同的 「obj」。

誰能好心幫我在這。謝謝。

+0

肖恩的答案似乎是你的問題一個很好的匹配(假設他你的問題的解釋是正確的),但目前尚不清楚你的要求。你爲什麼試圖從Base對象的成員函數中訪問一個Child對象的數據成員?對您的總體目標(或演示該示例的代碼示例)的描述會很有幫助。 – JBentley 2012-04-13 05:53:42

+2

你的最終目標是什麼?正如Alex Z所說,這是可能的,但我並不特別推薦它。基類不應該知道它的子類。繼承的腳趾的那種步驟。如果obj實際上是一個BaseType並且您試圖將它當作一個ChildType對待會發生什麼?壞事,壞事。 – Corbin 2012-04-13 05:55:10

+1

事實上,不同的設計可能是去這裏的路.. – 2012-04-13 06:04:01

回答

2

你的問題是有些模糊,但據我所知,你想是這樣的:

ChildType* child = dynamic_cast<ChildType*>(&obj); 

現在child指向obj,就好像它是ChildType類型,假設轉換是成功的。

瞭解更多關於類型轉換here.

編輯:我應該提一下像這樣的類型轉換應該避免,如果有更好的設計可以代替它。也許你應該在這裏重新考慮你的整體設計。

EDIT2:鑑於您最近編輯,這裏的示例代碼更具體的塊:

ChildType* child = dynamic_cast<ChildType*>(&obj); 
obj.x1 = child->y1; 
obj.x2 = child->y2; 
+0

我已經編輯了我的回覆,併爲您最近的修改量身定製了另一個示例。 – 2012-04-13 06:40:43

1

認爲你有沒有實現funcBase(類型兒童的對象)和你想要在這個對象上調用funcBase()並且讓funcBase()訪問Child :: obj而不是Base :: obj。如果是這樣的話,那麼我相信可以定義爲兒童

class Child : virtual public Base 
{ 
    ChildType obj; 
    ... 
} 

Virtual inheritance通常是用來解決diamond problem但我認爲可以用它來解決這個問題爲好。

如果我的假設是不正確然後隨意不理我了。

相關問題