2017-10-12 284 views
0
class Base { int type; }; 
class Derived1 : public Base { ... }; 
class Derived2 : public Base { ... }; 
class Container 
{ 
public: 
    Derived1 f1; 
    Derived2 f2; 
}; 

Container c; 

size_t offset = (size_t) static_cast<Base*>(&reinterpret_cast<Container*>(0)->f2); 
Base* base = reinterpret_cast<Base*>((size_t) c + offset); // ok 

Base Container::* ptr = &Container::f2; // compile error! 
base = c.*ptr; 

是否使用指針指向成員來獲取指向Base的指針的任何有效方法?C++指向成員的指針(指向成員的基類)

+0

您提領一個'nullptr',因此代碼未定義的行爲。也許['offsetof'](http://en.cppreference.com/w/cpp/types/offsetof)是你想要的。 – nwp

+0

'reinterpret_cast(0)'正式爲UB。除非執行保證它沒問題,否則不應該使用它。這就是'offsetof'的作用。 – StoryTeller

+0

這段代碼很混亂。即使你說工作的部分實際上也沒有編譯。 'Base Container :: * ptr'是一個無意義的類型名稱,不可能找出你的真正含義。在你提到編譯器錯誤的代碼中,你試圖找出甚至沒有地址的地址。 – Omnifarious

回答