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

나는 이것에 대한 답을 모르며, OO 관점에서 볼 때, 실제로 틀리다. 가상 함수를 사용하는 경우 가상 함수를 호출하고 구현에 대해 염려하지 않아야합니다. 이 규칙에 대한 예외를 처리 할 때 대개 객체의 유형이 검사됩니다 ([typeid] (http://en.cppreference.com/w/cpp/language/typeid), dynamic_cast) – stefaanv

답변

1

어떻게하면 좋을지 제안 해 주실 수 있습니까? 이 단순 예에서

B 인스턴스의 멤버 함수 포인터 분명히 이것은 테스트 소용이 없다 B 클래스의 멤버 함수의 주소를 갖는다.

일반적으로 알 수없는 파생 클래스의 인스턴스에 대한 포인터 또는 참조가있는 경우 해당 테스트를 표준 C++로 작성할 수 없습니다. 런타임에 가상 호출이 해결되는 함수의 주소를 가져올 방법이 없습니다.

그러나 GCC에는 정확히 수행 할 수있는 extension이 있습니다. 컴파일러가 사용하는 ABI를 문서화하는 경우

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

또는, 당신은 멤버 함수 포인터의 주소를 추출하는 사양을 사용할 수 있습니다.