将派生类赋值给基类的更好方法
c++ Better way to assign a derived class to a base class
这似乎是一个愚蠢的问题,但我希望能够实例化一个派生类并在一行中将其分配给基类:
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();
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 编写按初始值循环的循环的更好方法是什么
- 用 c++ 为游戏制作"bullet"的更好方法?
- 在CMakeLists中包含目录的更好方法.txt
- 将QDomDocument数据用作文本的更好方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 在 sqlite3 中批量插入的更好方法C++
- 设计许多单例代码结构的更好方法
- 使用继承的类模板避免公共成员不可见和源代码膨胀/重复的更好方法
- 在初始化列表中初始化数组的更好方法
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 构造具有大量数据的对象的更好方法(C++)
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 在C++中创建不可变对象的更好方法
- 在构造函数中组织初始值设定项列表的更好方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 删除数组成员的更好方法是什么?
- 在C 中操作数据的更好方法是什么