将派生类赋值给基类的更好方法

c++ Better way to assign a derived class to a base class

本文关键字:更好 方法 基类 派生 赋值      更新时间:2023-10-16

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

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。

谢谢!

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

在单行中实例化的对象(不使用new操作符)将只持续到对其求值的表达式结束。所以当你有了地址的时候,这个临时地址已经不存在了。

我试图获得多态行为不使用新的操作符。

要做到这一点,您需要一个命名变量为您的对象具有有效的生存期。

这与派生类无关—您正在尝试获取临时变量的地址。你需要计算出你希望对象存储在哪里,在堆栈还是堆上。

堆栈:

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

A* derived = new B();