2011-01-26 76 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等)。