1

void*C ++は、そうでないものにをキャストしようとすると、ランタイム例外をスローしますか?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 
4

4 に答える 4

8

void*C ++は、そうでないものにをキャストしようとすると、ランタイム例外をスローしますか?

いいえ、そうではありません。

プログラムの動作は未定義です。何かが起こる可能性があります。プログラムはほとんどの場合動作しているように見えるか、いつでもクラッシュするか、さらに悪いことが起こる可能性があります。

void*C ++のまれなケースを除いて、すべて回避する必要があります。を使用する代わりに、void*クラスの継承、ポリモーフィズム、またはテンプレートの使用を検討して、コードがタイプセーフであることを確認する必要があります。C ++を使用すると、タイプセーフではないコードを記述できますが、タイプセーフなコードを記述し、そのコードをはるかに単純で単純かつ正確にするのに役立つ多くのツールも提供されます。

于 2011-04-09T17:39:20.067 に答える
2

いいえ。ボイドをキャストできなかった場合*。あなたはそれで何ができますか!?実際、他のタイプのポインターに割り当てたり、逆参照したりするには、キャストする必要があります。

Cスタイルのキャストを使用した例では、C ++は、実行時にキャストの有効性をテストするなど、より安全なキャスト演算子をいくつかサポートしdynamic_castいます。

于 2011-04-09T17:40:02.577 に答える
0

いいえ、そうではありません。そのためvoid*、C++での使用は悪い習慣です。

の代わりにテンプレートを使用してくださいvoid*。それらはタイプセーフです。

void*Cコードを扱う場合にのみ使用してください。

于 2011-04-09T17:41:00.683 に答える
-1

いいえ。CまたはC++のいずれかで、これはこの言語で実行できる基本的な操作です。

于 2011-04-09T17:41:21.417 に答える