可以将匿名派生类的地址分配给基类指针C ++吗?

时间:2016-06-14 02:15:34

标签: c++ c++11

据我所知,在C ++中,您可以将派生类分配给基类的指针。这需要new运算符。我虽然也许我可以用匿名类实例化做一些类似的事情(不确定术语)。这是我尝试做的一个例子。这编译很好,但会产生运行时错误。有人可以解释一下运行时错误的原因,以及我试图做什么可能吗?

#include <iostream>

using namespace std;

class Base {
public:
    Base() {}
    ~Base() {}
    virtual void show() = 0;
};

class Derived : public Base {
public:
    int num;
    Derived() : num(0) {}
    Derived(int num) : num(num) {}
    virtual void show() { cout << num << endl; }
};

int main() {
    Base* ptr;
    /* 
     * I understand that I could do 
     * ptr = new Derived();
     * but I was wondering if I could do something with anonymous classes
     * as mentioned the following line compiles, but gives runtime error
     */
    ptr = &Derived();
    ptr->show();

    system("pause");
}

2 个答案:

答案 0 :(得分:1)

临时对象是临时的。它们在产生它们的声明的最后被销毁。由于你需要一个持续一段时间的对象,你必须做一些不同的事情。

(例外情况是将临时绑定到const引用;然后该对象将持续到引用范围的结尾)

答案 1 :(得分:0)

这一行:

ptr = &Derived();

您正在创建临时Derived并将指针存储在ptr中的临时对象中。因为它是临时的,所以它会在此行之后立即销毁,并且ptr引用了一个无效的对象。只需确保对象的生命周期在所有引用中都存活:

Derived d;
ptr = &d;