c++ - 指针转换导致 C++ 崩溃

标签 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<>),但没有任何效果。

问题是什么?

最佳答案

Derived* d;

那是一个指针,但您没有将其初始化为指向 Derived 对象,因此它具有无效值。使用它会产生未定义的行为;最有可能的是,由于访问无效地址而导致崩溃。

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

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

请注意,转换为基类指针不需要邪恶的转换(或者甚至是不那么邪恶的 C++ 风格的转换);你可以这样做

Base * b = &d;

关于c++ - 指针转换导致 C++ 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972494/

相关文章:

c++ - C++中的类成员变量可以定义多种数据类型吗?

c++ - 确定类静态变量的总大小?

c++ - C++重载运算符<用于结构:错误的参数太多

C++ ofstream不会将预期的数字写入文件

c++ - C++ vector 迭代器与指针

c# - 将字符串转换为枚举,但枚举类型仅在运行时已知

java - 扩展 File 类时出现 ClassCastException 问题

c++如何定义不复制数据的强制转换运算符?

c++ - '&buf_pool->watch[0]' 的语法含义是什么?

c++ - 检查表面是否在 SDL_FreeSurface 之前被释放