1

当您尝试将 a 强制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;
} 
4

4 回答 4

8

当您尝试将 a 强制void*转换为不是的东西时,C++ 是否会引发运行时异常?

不,它没有。

您的程序的行为是未定义的:任何事情都可能发生。该程序可能看起来大部分时间都在工作,它可能随时崩溃,或者可能发生更糟糕的事情。

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

于 2011-04-09T17:39:20.067 回答
2

不,如果你不能投空*。你能用它做什么!?实际上,您必须强制转换它才能将其分配给其他类型的指针或取消引用它。

在您的示例中,您使用了 C 样式转换,C++ 支持几个更安全的转换运算符,例如dynamic_cast运行时测试转换的有效性。

于 2011-04-09T17:40:02.577 回答
0

不,不是。这就是为什么void*在 C++ 中使用是不好的做法。

使用模板而不是void*. 它们是类型安全的。

void*只有在处理 C 代码时才应使用。

于 2011-04-09T17:41:00.683 回答
-1

不,在 C 或 C++ 中,这是我们可以用这种语言进行的基本操作。

于 2011-04-09T17:41:21.417 回答