2016-08-30 23 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++編寫。無法獲得虛擬呼叫在運行時解析的功能的地址。

但是,海灣合作委員會確實有一個extension,讓你做到這一點。或者,如果編譯器記錄它使用的ABI,則可以使用規範從成員函數指針中提取地址。

相關問題