C++中将派生类赋值给基类的更好方式

5
这似乎是个简单的问题,但我希望能够在一行代码中实例化派生类并将其赋值给基类:
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

我希望在不使用new运算符的情况下实现多态行为。我认为编译器会插入对构造函数返回值的临时引用。是否可能告诉编译器我实际上想要使用该地址进行赋值? * 编辑 这里是一些背景信息。在解析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。谢谢!

在VS2010中没有警告。你使用的是哪个编译器? - Phillip Ngan
我认为你所说或想要的大部分都没有意义。你能稍微退后一步,说一下你需要解决什么问题吗?你是指说 A * p = new B(); 吗? - Kerrek SB
@phillip 我正在使用的编译器是gcc 4.5.2。 - JaySilk84
2个回答

4
我希望能在一行代码中实例化派生类并将其分配给基类。
在使用new运算符的情况下,在单行内实例化的对象只会存在到该表达式的结束。因此,当您获得地址时,临时变量已不存在。
我正在尝试获得多态行为,而无需使用new运算符。
为了做到这一点,您需要一个命名变量来拥有您的对象的有效生命周期。

3
这与派生类无关 - 您正在尝试获取临时变量的地址。您需要确定您希望对象存储在堆栈上还是堆上。
堆栈:
B derived; // this works as an A any place you need it to

堆:

A* derived = new B();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接