C++ では禁止されていますが、ライブラリに実装されているクラスの非仮想メンバー関数にアクセスしたいと思っています。
通常はありえないのですが、ハックはありますか?
仮想プライベート関数へのアクセスに関連するいくつかのハックを知っていますが、非仮想のものには何もないようです。
問題の例を次に示します。
class A
{
private:
void func(void);
};
func はクラス A の外でアクセスできますか?
それは、あなたが受け入れる準備ができている醜さの種類に依存します. 私はこの種の壊れやすいハッカーを避けるためにほとんど何でもしており、デバッグ/トラブルシューティングの目的であっても商用コードでこのようなことをしたことはありませんが、投げかけられる典型的な提案は次のとおりです。
#define private public
「ハッキング」するクラスを定義するヘッダーを含める前に (コメントを参照 - おそらく未定義の動作)#define private public
上記のハックと同じような未定義の動作の傾向があります。どちらもA
-異なる実際のデータ メンバー レイアウトを持つクラスと同様)この最後の例として、.cc/.cpp/.whatever 実装ファイルにアクセスできる場合、次のようなことができる場合があります...
#include "a.h"
#include "a.cc" // normally link a.o to get this - I couldn't be bothered
namespace Hack
{
class A { public: void func(); };
#include "a.cc" // you do have to include this one though...
}
int main()
{
A a;
((Hack::A&)a).func();
}
... をインクルードして呼び出す単純class A
なfunc()
実装ファイルで動作するようになりましたが、複雑なインクルードとコンテンツを含む現実的なヘッダーと実装ファイルを指定すると、名前空間/シンボルの衝突の問題が発生する可能性があると思われます。<iostream>
std::cout << "x\n";
フレンド クラスを使用するバックドアがあっても、クラス外のプライベート メンバー関数にアクセスしないでください。最後の手段としてフレンドを使用してください。
あなたが学術的な目的でこれを試したいのでない限り、あなたがこれをやりたい理由がわかりません.
クラス外でプライベート関数を呼び出すことはできません