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)
当您尝试将某个内容转换
void*为某些内容时,C++是否会抛出运行时异常?
不,它没有.
你的程序的行为是不确定的:任何事情都可能发生.该程序可能在大多数情况下似乎工作,它可能在任何时候崩溃,或者可能发生更糟糕的事情.
void*应该避免在C++中的少数几种情况下除外; void*您应该考虑使用类继承,多态或模板来确保您的代码是类型安全的,而不是诉诸于使用.虽然C++确实允许您编写非类型安全的代码,但它还提供了许多工具,可帮助您编写类型安全代码并使代码更加简单,简单和正确.