2012-02-15 93 views
1

我需要通過基類變量訪問派生類成員變量。我需要通過基類靜態變量訪問派生類成員

Class A{ 

}; 

Class B:public A { 
    int data; 
}; 

現在我需要做這樣的事情

A *pb = new B() 
pb->data = 10; 

但問題是wihtout它,我不能訪問派生成員類。

是的,我知道如何使它與虛擬功能。

謝謝,我真的很感謝你的幫助。

回答

1

簡答:你不行。因爲你的編譯器不知道pb是什麼。它可能是A。但是,您使用的是dynamic_cast,如果這不可行,則返回B指針或NULL

A *pa = new B(); 
B *pb = dynamic_cast<B*>(pa); 
if (pb) { 
    pb->data = 10; 
} 
else { 
    ... 
} 

總之,如果你需要做的,它可能意味着,上溯造型是不是一個好主意,你應該修改你的設計。有時候,你無法避免它。例如。當使用外部庫等。

2

需求指向錯誤的設計。

但是,如果你真的堅持寫錯誤的代碼,你可以投回到B *

+0

+1但您應該指定投射不安全。 – 2012-02-15 19:38:44

+0

是的,其實我的代碼沒有這樣的情況。但是,只是想知道,如果我必須做這樣的事情....但是它是如何產生錯誤的設計,所以你的意思是,所有的派生類成員只需要通過構造函數來初始化/修改?或通過虛擬功能? – howtechstuffworks 2012-02-15 19:41:22

+0

@howtechstuffworks從父類訪問派生類成員意味着有些問題。 Parent本身就是一個可行的對象,並且應該能夠在沒有任何派生對象的情況下存在,除非它是純虛擬類。這樣做的正確方法是通過在父級級別定義的虛擬函數。 – littleadv 2012-02-15 19:48:13

2

沒有虛擬功能,你可以做的唯一事情就是向下轉發它。有幾種方法去有關:

  • 您可以使用dynamic_cast的,如果你啓用RTTI,你必須在父類中的至少一個虛擬功能,可以讓你檢查,看看是否投得手與否。
  • static_cast將允許您在繼承樹中投射到下面的某個東西,但是您失去了檢查它是否成功的能力。
  • 你也可以完全謹慎地使用風,並使用C風格的演員陣容。
+0

沒有虛擬功能,dynamic_cast不可用。 – 2012-02-15 19:39:02

+0

^有意義......我想知道,如果我們有類似虛擬變量或東西的東西,這會讓生活更輕鬆........但動態演員陣容很方便.....謝謝 – howtechstuffworks 2012-02-15 19:40:29

+0

好矯正陸。。將更新我的答案... – 2012-02-15 20:14:08

相關問題