【问题标题】:c++ Better way to assign a derived class to a base classc ++更好的方法将派生类分配给基类
【发布时间】:2011-10-20 03:47:11
【问题描述】:

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

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 中没有警告。你用的是哪个编译器?
  • 我认为您所说或想的大部分内容都没有道理。你能退一步说一下你需要解决什么问题吗?你的意思是说A * p = new B();
  • @phillip gcc 4.5.2 是我正在使用的编译器

标签: c++ polymorphism


【解决方案1】:

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

在一行中实例化的对象(不使用 new 运算符)只会持续到计算它的表达式的末尾。所以到你有地址的时候,临时的已经不存在了。

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

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

【讨论】:

    【解决方案2】:

    这与派生类无关——您正在尝试获取临时变量的地址。您需要确定对象的存储位置,堆栈或堆。

    堆栈:

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

    堆:

    A* derived = new B();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-24
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多