2017-08-15 15 views
-1

私が持っている例:私は唯一*「をptr'.Iは、そのポインタがタイプである知っている 『』が、私はそれがクラスのオブジェクトを指しているかどうかわからない」ポインタを持って基本クラスオブジェクトへのポインタを持っていると、どうすれば仮想メソッドのアドレスを取得できますか?

class A{ 
public: 
virtual void run(){...} 
}; 


class B:public A { 
public: void run(){...} 
}; 


A* ptr= new B(); 

'または' B 'またはクラスAから派生し、関数' run 'を実装する他のクラス' X '(私の例では、オブジェクトは' B '型です)それは私のオブジェクトのクラスで実装されていますか?

+5

なぜあなたはそれを知る必要がありますか? – litelite

+0

(実際に使用される) 'run'関数のアドレスは、通常はプログラマーには表示されない仮想テーブル内にしかありません。これを行うことで正確に何を達成しようとしているのですか?関数のアドレスが実際に必要ですか、または正しい派生関数へのランタイムディスパッチが行われているという確認を探していますか? – Xirema

+0

関数ポインタまたはアドレスが必要ですか? – alain

答えて

1

あなたの好きなような音dynamic_cast dynamic_castをさまざまな派生クラスの型に変換し、有効なポインタを取得するかどうかをテストしたり、nullptrを返します。これにより、基本クラスポインタが指すオブジェクトの動的な型を決定できます。

+0

ええ、しかし、私は関数のアドレスを取得していない、と私はすべてのタイプの名前を知らない。 – nikojov

0

私が理解する限り、それを実行するポータブルな方法はありません。 オプション:

  1. vtblを手動で検索します。それはポータブルではありません。
  2. あなたは、基本クラスを変更することができた場合は、必要な情報
  3. をご提供するために、そのユーザーを強制しようとしますが、ソート
void f(A *object) { 
    object->run(); 
} 

、代わりにアドレスの代わりにそのアドレスを使用するラッパーを書くことができます実際の実行機能の?

Btw、何をお探しですか?メンバー関数へのポインタ?実装へのポインタ?ちょっとしたアドレス?

関連する問題