次のコードは正しくコンパイルされ、正しく動作し、クラスの保護されたフィールドにアクセスできます。しかし、これはいいことですか?汚い感じて、私は、Javaから来て何を知っていますか:reinterpret_castを悪用してオブジェクトが派生クラスに変換されていない場合は、それを悪用することはできますか?
#include <iostream>
class Base {
public:
Base() : _f(42) {
}
int getF() { return _f; }
protected:
int _f;
};
class Der : public Base {
public:
void setF(int f) { _f = f; }
};
int main(int argc, char ** argv) {
Base *b = new Base();
std::cout << b->getF() << std::endl;
Der *d = reinterpret_cast<Der*>(b);
d->setF(37);
std::cout << b->getF()<< std::endl;
}
そして、私は右だと、これはOKでない場合は、どのような良い方法は、通常はする必要はありませんオブジェクトの内部カプセル化されたデータフィールドを公開しています変更する必要がありますが、テスト時に変更する必要がありますか?インスタンスは他のコンポーネントの内部に深く作られているので、型の変更は簡単ではありません。
私はこの爆発を見ることができませんが、これは未定義の動作です。 – NathanOliver
'reinterpret_cast'で許可されていることのリストについては、[here](http://en.cppreference.com/w/cpp/language/reinterpret_cast)を参照してください。 –
法律を破る良い方法はありません。 –