言語弁護士によって反対票を投じられる危険を冒して、興味深いかもしれないことを願って、ハッカーのちょっとしたアドバイスを以下に示します。プライベート メンバーは、クラスおよびクラスのフレンドの外部からアクセスするためのものではありません。ただし、クラスのこれらのメンバー フィールドに絶対にアクセスする必要がある場合は、次のようなハックが機能する可能性があります。
#include <iostream>
class vivek {
int i;
float d;
public:
vivek() : i(4), d(4.44) {}
~vivek() {}
};
int main()
{
vivek viku;
struct badhack {
int i;
float d;
} *h = (sizeof(badhack) == sizeof viku ? (badhack*)&viku
: ((badhack*)((char*)&viku + sizeof(void*))));
std::cout << "i=" << h->i << ", d=" << h->d << std::endl;
}
sizeof(void*)
sizeof を使用したゲームに注意してください。これは、バイトを取り、仮想メンバーが存在するクラスの最初の暗黙的なフィールドである仮想テーブルを決定する例にすぎません。そうしないと、たまたまクラスに仮想テーブルがある場合、データ オフセットが台無しになり、トリックが機能しないsizeof(void*)
ため、その問題を回避するためにオフセットをバイト単位で調整します。現在、これは標準では定義されておらず、コンパイラ固有ですが、これが最も効率的な方法であるため、仮想テーブルを異なる方法で実装するコンパイラに遭遇したことはありません。
別のオプションは、次のように簡単です。
#include <iostream>
#define class struct
#define private public
class vivek {
int i;
float d;
public:
vivek() : i(4), d(4.44) {}
~vivek() {}
};
int main()
{
vivek viku;
std::cout << "i=" << viku.i << ", d=" << viku.d << std::endl;
return 0;
}
ただし、上記はメンバー関数では機能しない可能性が高いことに注意してください。最近のコンパイラはスマートで、アクセス レベルに応じてさまざまな方法で関数名をマングルします。
そして、誰かの命を救う必要があり、その見返りに自分の命を喜んで犠牲にする場合を除き、このようなトリックを使用しないでください.