c ++将派生类分配给基类的更好方法

时间:2011-10-20 03:47:12

标签: c++ polymorphism

这似乎是一个愚蠢的问题,但我希望能够实例化派生类并将其分配到一行中的基类:

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。

谢谢!

2 个答案:

答案 0 :(得分:4)

  

我希望能够实例化派生类并将其分配给一行中的基类

在单行中实例化的对象(不使用new运算符)将仅持续到计算它的表达式的结尾。因此,只要您拥有地址,临时就不再存在。

  

我试图在不使用new运算符的情况下获得多态行为。

要做到这一点,您需要一个命名变量来为您的对象提供有效的生命周期。

答案 1 :(得分:3)

这不是派生类 - 您试图获取临时变量的地址。您需要确定在堆栈或堆上存储对象的位置。

堆栈:

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

堆:

A* derived = new B();