質問

C++で簡単に作成関数ポインタのアドレスの会員機能です。しかし、変更することは可能での住所地機能しているのでしょうか。

I.。言いfuncA()およびfuncB()と同じクラス定義とは異なります。また、住所変更のfuncA()このfuncB()は、実行時に呼び出しfuncA()実際に結果を呼び出funcB().ごきげんよう、トメ子です美しくはないけれども、私は必要なことです。

編集----------

その背景をどのようにしている:

今の実施単位試験のための既存のコードベースの手法の基底クラスのすべてのモジュールを継承して非virtualなのです。ないんですがデータを編集する生産コードです。できると、怒の構築プロセス及び代理入力者(代理人)の基底クラスに関連する方法の設定に仮想がようと思ってご利用くにハックのようなことを思った。

もにも興味を持っている話題の技術的な好奇心としての過程を通じてハック周辺のこの問題はいったいどのようなコード生成-機能look-upの下にフード、たって、学ぶこともできる学校を終え、年が明けてもまだまだ続く2年間の大学です。なんなのかしていないことを教えないものとして大学に私はコンピュータ工学教育プログラムによCS.

バ題 の方法にfuncA()およびfuncB()この署名ので、問題はこの関数のアドレスを使用のオペレーター?もし正しいうるか変更することができませんのアドレスの機能またはスワップの内容とアドレスなcorrupting部のメモリ?うDLL注入する良いアプローチのための状況ではこのような場合、機能に輸出されているdll?

役に立ちましたか?

解決

はありません。プログラムの寿命を通じて機能を実行可能ファイルにコンパイルされており、そのアドレスは固定されます。

最も近いものは、仮想関数です。私たちはあなたが達成しようとしているものの例を与える、私はより良い方法があります約束します。

他のヒント

それはあなたがそれを記述する方法を行うことはできません。静的にバインドされた呼び出しのターゲットを変更する唯一の方法は、あなたのプログラムの実際の実行可能コードを変更することです。 C ++言語は、それを達成できた何の機能を持っていません。

あなたが関数呼び出しを使用し、明示的に間接呼び出し(関数ポインタによる呼び出し)、または(仮想関数のような)ランタイム・コールの解像度に基づいており、使用言語の機能のいずれかにあなたが持っている実行時に解決されるようにする場合、またはあなたは良い、古いifまたはswitchでプレーンな分岐を使用することができます。あなたのケースでは、より適切である、あなたの特定の問題に依存します。

技術的には、それはタイプのvtableのを修正することにより、仮想関数は可能かもしれませんが、あなたが最も確かに(未定義の動作を引き起こす)規格に違反することなくそれを行うことはできませんし、それがどのように特定のコンパイラハンドルのvtableの知識が必要になります。

関数のアドレスを直接読み出し専用メモリ領域に一般的にプログラムコードに書かれているので、

は、他の機能のためには不可能である。

関数へのポインタである何がしたい、あなたは彼らが同じシグネチャを持っていると仮定しFUNCAまたはfuncBのにそれを指すことができます。

私はかなり確かこれは純粋なC ++には不可能であると思います。 C ++は、動的言語ではありません。

あなたが直接やりたいことはできません。関数ポインタ - しかし、あなたはすでに精通しているものを使用して、いくつかのわずかに異なる基準で同様の結果を得ることができます。考えてみます:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};

さて、あなたはどのFunctionインスタンス上Tメンバーを設定し、それを呼び出すことができます。これは、あなたが合理的に得ることができるよう近くにについてです、と私はあなたがすでに関数ポインタを認識しているので、あなたはすでにこのソリューションの認識していると推定します。

なぜあなたは、あなたが解決しようとしている問題のより完全な説明とあなたの質問を編集しませんか?それはあなたが恐ろしい何かをしようとしているように聞こえます。

実際にそれをスタンドとして

そのシンプルな!

のために

  実行時てfuncAを(呼び出し)funcBの()の呼び出しで、実際の結果ます。

次のような書き込みfuncA()ます:

int funcA( int a, int b) {
  return funcB( a, b );
}

: - )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top