2012-05-06 91 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? 

編輯: 我想他們是2個獨立的價值,但兩者

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

一代產量相同的值,他們不應是多種不同偏移如果繼承樹不虛?

+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