次のクラスがある場合:
class Foo
{
protected:
int i;
public:
Foo() : i(42) {}
};
当然、外部から保護されたメンバーにアクセスすることはできませんが、次の小さなトリックを実行できます。まず、Foo を継承する新しいクラスを作成します。
class Foo2 : public Foo
{
public:
int GetI() { return i; }
};
これで、Foo のインスタンスまたはそのようなインスタンスへのポインターがある場合はいつでも、キャストを介して保護されたメンバーにアクセスできます (追加のメンバーを使用しないため)。
Foo *f = new Foo();
Foo f2;
std::cout << ((Foo2*)f)->GetI() << std::endl;
std::cout << (reinterpret_cast<Foo2&>(f2)).GetI() << std::endl;
これが機能する理由は理解できますが、悪い結果が生じることはありますか? コンパイラは気にしません。実行時のチェックはありません。