我需要通過基類變量訪問派生類成員變量。我需要通過基類靜態變量訪問派生類成員
Class A{
};
Class B:public A {
int data;
};
現在我需要做這樣的事情
A *pb = new B()
pb->data = 10;
但問題是wihtout它,我不能訪問派生成員類。
是的,我知道如何使它與虛擬功能。
謝謝,我真的很感謝你的幫助。
我需要通過基類變量訪問派生類成員變量。我需要通過基類靜態變量訪問派生類成員
Class A{
};
Class B:public A {
int data;
};
現在我需要做這樣的事情
A *pb = new B()
pb->data = 10;
但問題是wihtout它,我不能訪問派生成員類。
是的,我知道如何使它與虛擬功能。
謝謝,我真的很感謝你的幫助。
簡答:你不行。因爲你的編譯器不知道pb
是什麼。它可能是A
。但是,您使用的是dynamic_cast
,如果這不可行,則返回B
指針或NULL
。
A *pa = new B();
B *pb = dynamic_cast<B*>(pa);
if (pb) {
pb->data = 10;
}
else {
...
}
總之,如果你需要做的,它可能意味着,上溯造型是不是一個好主意,你應該修改你的設計。有時候,你無法避免它。例如。當使用外部庫等。
需求指向錯誤的設計。
但是,如果你真的堅持寫錯誤的代碼,你可以投回到B *
。
沒有虛擬功能,你可以做的唯一事情就是向下轉發它。有幾種方法去有關:
沒有虛擬功能,dynamic_cast不可用。 – 2012-02-15 19:39:02
^有意義......我想知道,如果我們有類似虛擬變量或東西的東西,這會讓生活更輕鬆........但動態演員陣容很方便.....謝謝 – howtechstuffworks 2012-02-15 19:40:29
好矯正陸。。將更新我的答案... – 2012-02-15 20:14:08
+1但您應該指定投射不安全。 – 2012-02-15 19:38:44
是的,其實我的代碼沒有這樣的情況。但是,只是想知道,如果我必須做這樣的事情....但是它是如何產生錯誤的設計,所以你的意思是,所有的派生類成員只需要通過構造函數來初始化/修改?或通過虛擬功能? – howtechstuffworks 2012-02-15 19:41:22
@howtechstuffworks從父類訪問派生類成員意味着有些問題。 Parent本身就是一個可行的對象,並且應該能夠在沒有任何派生對象的情況下存在,除非它是純虛擬類。這樣做的正確方法是通過在父級級別定義的虛擬函數。 – littleadv 2012-02-15 19:48:13