2016-08-30 2 views
1

特定のオブジェクトインスタンスの仮想関数が特定の実装のものであるかどうかを確認しようとしています。オブジェクトインスタンス上の仮想関数をチェックする方法は特定の実装です

#include <cstdio> 
using namespace std; 

class A 
{ 
public: 

    virtual void method() 
    { 
      printf("This is from A \n"); 
    } 
}; 

class B : public A 
{ 
public: 
    virtual void method() 
    { 
      printf("This is from B \n"); 
    } 
}; 

int main() 
{ 
    B b; 

    b.method(); 
    if (b.&method == &B::method) 
    { 
      printf("Horray! simple. \n"); 
    } 


    return 0; 
} 

しかし、明らかに動作しませんif (b.&method == &B::method)ライン:直感的には、次のコードセグメントのように見えます。

これがどのように機能するのかを親切にお勧めできますか?ありがとう。

+3

もし*あなたがこれをやりたいと思うかもしれないと説明できれば、私たちはあなたを助けることができるかもしれませんか?解決したい*実際の問題は何ですか?関連する[XY問題について](http://xyproblem.info/)。 –

+1

これがB型のオブジェクトである場合、Bのメソッドオーバーロードは明らかに冷たくなります。だから質問を理解することはできません。 –

+2

私はこれについての答えを知りませんし、オブジェクト指向の観点からは、実際には間違っています。仮想関数を使用する場合は、それらを呼び出すだけで、実装について心配する必要はありません。このルールの例外を処理する場合、通常、オブジェクトのタイプが検査されます([typeid](http://en.cppreference.com/w/cpp/language/typeid)、dynamic_cast) – stefaanv

答えて

1

これがどのように機能するのかを親切にお伝えできますか?この簡単な例で

Bのインスタンスのメンバ関数ポインタは明らかにこれをテストするにはポイントが存在しないクラスBのメンバ関数のアドレスを有しています。

一般に、未知の派生クラスのインスタンスへのポインタまたは参照がある場合、そのようなテストは標準のC++で記述できませんでした。実行時に仮想呼び出しが解決する関数のアドレスを取得する方法はありません。

しかし、GCCにはextensionがあり、それを正確に行うことができます。

typedef int (*fptr)(A *); 
fptr p = (fptr)(a.*fp); 

あるいは、コンパイラはそれが使用するABIを文書化する場合は、メンバ関数ポインタからアドレスを抽出するための仕様を使用することができます。

関連する問題