问题是:
a)以下代码是否合法? (考虑到它在运行时崩溃)
b)如果在编译时显示gcc或MVC的任何编译器标志,则以下代码中存在潜在问题?
#include <iostream>
using namespace std;
class A
{
public:
void write(){ cout<<"A"; }
};
class B
{
public:
virtual void write(){ cout<<"B"; }
};
int main()
{
A *pa=(A*) new B();
pa->write();
B *pb=(B*) new A() ;
pb->write();
delete pa;
delete pb;
return 0;
}
谢谢!
答案 0 :(得分:5)
不,这不合法。 B
不是来自A
,反之亦然。强制执行此类转换会导致未定义的行为。你告诉编译器“闭嘴,我知道我在做什么”,这会导致各种各样的麻烦。这是避免旧C风格转换的一个原因,而是使用C ++风格的转换(static_cast
等)。