C++ - 转换void指针

Kev*_*vin 1 c++ polymorphism void-pointers

当您尝试将某个内容转换void*为某些内容时,C++是否会抛出运行时异常?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 8

当您尝试将某个内容转换void*为某些内容时,C++是否会抛出运行时异常?

不,它没有.

你的程序的行为是不确定的:任何事情都可能发生.该程序可能在大多数情况下似乎工作,它可能在任何时候崩溃,或者可能发生更糟糕的事情.

void*应该避免在C++中的少数几种情况下除外; void*您应该考虑使用类继承,多态或模板来确保您的代码是类型安全的,而不是诉诸于使用.虽然C++确实允许您编写非类型安全的代码,但它还提供了许多工具,可帮助您编写类型安全代码并使代码更加简单,简单和正确.