2012-05-06 1 views
2

다중 상속을 가진 클래스에서 데이터 멤버에 대한 포인터를 얻는 방법이 있는지 확인하려고합니다. 모호성을 제거하고 올바른 오프셋을 얻는 방법이 있습니까?상속 된 데이터 멤버에 대한 포인터 다중 상속

struct Foo 
{ 
    int BarData; 
}; 

struct FooBarBaseA : public Foo 
{ 
    int DataA; 
}; 

struct FooBarBaseB : public Foo 
{ 
    int DataB; 
}; 

struct FooBar : public FooBarBaseA, public FooBarBaseB 
{ 

}; 

Bar FooBar::* p1 = &FooBar::FooBarNodeA::BarData; // should be 0? 
Bar FooBar::* p2 = &FooBar::FooBarNodeB::BarData; // should be 4 or 8? 

편집 : 나는 그들이이 개 독립적 인 값이되고 싶지 않지만, 모두

int FooBar::FooBarBaseA::Foo:: *p1 = &FooBar::FooBarBaseA::Foo::BarData; and 
int FooBar::FooBarBaseB::Foo:: *p2 = &FooBar::FooBarBaseB::Foo::BarData; 

가 같은 값을 yeild 상속 트리가 가상이 아닌 경우, 서로 다른 오프셋 안?

+0

당신은 그들이이 작은 프로그램을 사용하여 다른 오프셋 얻을 것을 볼 수있다 :'는 foobar의 X를; ptrdiff_t d1 = (char *) & x.FooBarBaseA :: BarData - (char *) & x; ptrdiff_t d2 = (char *) & x.FooBarBaseB :: BarData - (char *) & x; cout << hex << d1 << ""<< hex << d2 << endl;'멤버에 대한 포인터를 얻는 것이 효과적이지 않습니다 - 내가 시도한 모든 컴파일러에서 모호한 오류가 발생합니다. – dasblinkenlight

답변

2

이 코드는 당신이 찾고있는 것을 보여줍니다 믿습니다

#include <iostream> 
#include <typeinfo> 

using std::cerr; 

struct Foo 
{ 
    int BarData; 
}; 

struct FooBarBaseA : public Foo 
{ 
    int DataA; 
}; 

struct FooBarBaseB : public Foo 
{ 
    int DataB; 
}; 

struct FooBar : public FooBarBaseA, public FooBarBaseB 
{ 

}; 

int main(int argc,char **argv) 
{ 
    int FooBar::* p1 = static_cast<int FooBarBaseA::*>(&Foo::BarData); 
    int FooBar::* p2 = static_cast<int FooBarBaseB::*>(&Foo::BarData); 
    FooBar foo; 
    foo.FooBarBaseA::BarData = 1; 
    foo.FooBarBaseB::BarData = 2; 
    cerr << (foo.*p1) << "\n"; 
    cerr << (foo.*p2) << "\n"; 
    return 0; 
} 

출력 :

1 
2 
+0

이것은 내가 찾고있는 것입니다. 정말 고마워요! – kylawl

+0

@ user1377598 : 대답의 왼쪽에있는 확인란 개요를 클릭하여 [허용 된 답변으로 표시하는 것을 잊지 마세요.] (http://stackoverflow.com/faq#howtoask) – Johnsyweb