2017-10-12 6 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

답변