2011-01-26 80 views
1

问题是:
a)以下代码是否合法? (考虑到它在运行时崩溃)
b)如果在编译时有任何编译器标志让gcc或MVC显示,那么在下面的代码中可能存在一个问题?C++动态绑定问题

#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

另外,你是C风格的铸造,请尝试C++铸造操作员 – 2011-01-26 14:58:12

+0

@baris:这不是*暗示*铸造! – 2011-01-26 14:59:24

回答

5

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