-2

C++ では禁止されていますが、ライブラリに実装されているクラスの非仮想メンバー関数にアクセスしたいと思っています。

通常はありえないのですが、ハックはありますか?

仮想プライベート関数へのアクセスに関連するいくつかのハックを知っていますが、非仮想のものには何もないようです。

問題の例を次に示します。

class A
{
private:
    void func(void);
};

func はクラス A の外でアクセスできますか?

4

3 に答える 3

2

それは、あなたが受け入れる準備ができている醜さの種類に依存します. 私はこの種の壊れやすいハッカーを避けるためにほとんど何でもしており、デバッグ/トラブルシューティングの目的であっても商用コードでこのようなことをしたことはありませんが、投げかけられる典型的な提案は次のとおりです。

  • #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 Afunc()実装ファイルで動作するようになりましたが、複雑なインクルードとコンテンツを含む現実的なヘッダーと実装ファイルを指定すると、名前空間/シンボルの衝突の問題が発生する可能性があると思われます。<iostream>std::cout << "x\n";

于 2013-05-29T05:34:29.003 に答える
2

フレンド クラスを使用するバックドアがあっても、クラス外のプライベート メンバー関数にアクセスしないでください。最後の手段としてフレンドを使用してください。

あなたが学術的な目的でこれを試したいのでない限り、あなたがこれをやりたい理由がわかりません.

于 2013-05-29T05:34:31.247 に答える
2

クラス外でプライベート関数を呼び出すことはできません

于 2013-05-29T05:31:22.147 に答える