C ++动态绑定问题

时间:2011-01-26 14:53:01

标签: c++ model-view-controller g++

问题是:
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;
}

谢谢!

1 个答案:

答案 0 :(得分:5)

不,这不合法。 B不是来自A,反之亦然。强制执行此类转换会导致未定义的行为。你告诉编译器“闭嘴,我知道我在做什么”,这会导致各种各样的麻烦。这是避免旧C风格转换的一个原因,而是使用C ++风格的转换(static_cast等)。