2

コンパイルすべきではないと思われる数行のコードを書きました。次のように、基本クラスのオブジェクトへの static_cast-ed ポインターで派生クラスのメソッドを呼び出しています。

class B {};    

class D: public B
{
public:
    void bar() { printf("%d\n", m_i); }
private:
    int m_i;
};

int main()
{
    B b;
    D* d = static_cast<D*>(&b);
    d->bar();
    return 0;
}

出力された値は明らかにがらくたですが、これはコンパイルする必要がありますか? どうgccやってそれを行うことができますか?

4

2 に答える 2

1

gcc実際にチェックする価値がない十分な少数のケースを除いて、それが間違っていることを保証することはできません. を使用するときはstatic_cast、実行している wtf を知っていることをコンパイラに約束します。

ここには2種類のキャストがいます。static_cast、つまり、ベースへのポインターは派生へのポインターであることをコンパイラーに伝え、黙ってそれを続けます。dynamic_cast、つまり、ベースへのポインターが実際に派生へのポインターであるかどうかを確認するようにコンパイラーに要求しています。を使用static_castしたので、コンパイラはシャットダウンして、あなたが言ったようにしました。

dynamic_cast編集: ジョンは、継承階層に仮想関数がなく、C++ から解雇する必要があり、仮想関数に対してのみ有効であることを正確に指摘しました。

于 2011-01-05T18:18:14.000 に答える
0

static_cast<> を使用して、コンパイラに「自分がやっていることはわかっています。B* は実際には D* であることを知っています。黙って、私の言うことを実行してください。」

于 2011-01-05T18:18:05.417 に答える