指针式转换会导致c ++崩溃

时间:2015-04-30 15:59:13

标签: c++ pointers casting crash virtual

#include <iostream>

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

class Derived : public Base {
public:
    void print() {
        std::cout << "test\n";
    }
};

Base* getBase (Derived* d) {
    return (Base*) d;
}

int main()
{
    Derived* d;
    Base* b = getBase(d);
    b->print();

    return 0;
}

此代码编译(使用g ++)没有任何问题,但在运行后,它崩溃了! 我尝试了不同类型的转换(如static_cast&lt;&gt;),但没有任何效果。

有什么问题?

2 个答案:

答案 0 :(得分:6)

Derived* d;

这是一个指针,但你不要将它初始化为指向Derived对象,因此它的值无效。使用它会产生不确定的行为;最有可能的是,由于访问了无效的地址而导致崩溃。

尝试创建一个对象,然后使用指向该对象的指针:

Derived d;
Base * b = getBase(&d);

请注意,转换为基类指针不需要恶魔演员(甚至是邪恶的C ++风格演员);你可以做到

Base * b = &d;

答案 1 :(得分:3)

您没有分配对象的实例,例如

Derived* d = new Derived();

因此变量d包含无法解除引用的垃圾数据。