2011-10-20 42 views
4

這似乎是一個愚蠢的問題,但我希望能夠實例化一個派生類,它在同一行分配給基類:C++派生類分配給一個基類更好的辦法

class A { }; 
class B : public A { }; 

// i can do this 
A *base; 
B derived; 
base = &derived; 

// i'd like to do something like this 
A *base; 
base = &B(); // produces a warning: taking address of temporary 

我試圖在不使用新運算符的情況下獲得多態行爲。我認爲編譯器正在爲構造函數的返回值插入一個臨時引用。是否可以指示編譯器確實要將該地址用於分配?

*編輯

這裏有一個小範圍內。我有這樣的事情解析XML文件時:

class element { virtual void load_xml(...); }; 
class city : public element { ... }; 
class state : public element { ... }; 

element *base; 
// read some xml 

if (xml_node == "city") { 
    base = &city(); 
} else if (xml_node == "state") { 
    base = &state(); 
} 

base.load_xml(...); 

的想法是,每個派生節點知道如何滋潤本身將覆蓋load_xml()函數來做到這一點。我想我應該做的是在每個if塊中調用load_xml,而不是嘗試將每個派生類分配給基類,然後從基類調用load_xml。

謝謝!

+0

在VS2010中沒有警告。你正在使用哪種編譯器? –

+0

我想大部分你說的或者你想要的東西都沒有意義。你能退一步說出你需要解決什麼問題嗎?你的意思是說'A * p = new B();'? –

+0

@phillip gcc 4.5.2是我正在使用的編譯器 – JaySilk84

回答

4

我希望能夠實例化一個派生類,它在同一行分配給一個基類

在一行內實例化的對象(不使用新的操作符)只會持續到ex的結尾壓力,評估它。所以,由於你有地址,暫時不再存在。

我試圖得到不使用新操作符的多態行爲。

要做到這一點,您需要一個命名變量來爲您的對象有一個有效的生命週期。

3

這不是關於派生類 - 你正試圖獲取一個臨時變量的地址。您需要確定要將對象存儲在堆棧還是堆中。

堆棧:

B derived; // this works as an A any place you need it to 

堆:

A* derived = new B();