2011-01-26 17 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 + +のキャスト演算子 –

+0

@バリス:それは* implict *キャスティングではない! –

+0

'新しいB()'を 'A *'にキャストする特別な理由はありますか?それらはすべて互いに関連しているわけではありません。 – Naveen

答えて

5

いいえ、合法的ではありません。 BAから派生したものではなく、その逆もありません。このようなキャストを強制すると、未定義の動作になります。あなたは、コンパイラに「黙って、私がやっていることを知っている」と言っています。これはあらゆる種類の問題につながります。これは、古いCスタイルのキャストを避け、代わりにC++スタイルのキャストを使用する理由の1つです(static_castなど)。

+0

でも、 'reinterpret_cast'を使って足で自分自身を撃つことができます。 – Naveen

+0

@Naveen:はい。しかし、 'reinterpret_cast'はあなたのソースコードの一種の「赤旗」として設計されています。コードレビューでそれらを見つけるのはとても簡単です! –

関連する問題