2011-10-20 40 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();