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++ 멤버에 대한 포인터 (멤버의 기본 클래스에 대한 포인터)
당신은'nullptr'를 역 참조하는 때문에 코드가 정의되지 않은 한 행동에있어 매우 가능성이 높습니다. 어쩌면 ['offsetof'] (http://en.cppreference.com/w/cpp/types/offsetof)가 당신이 원하는 것일 수도 있습니다. – nwp
'reinterpret_cast (0)'는 공식적으로 UB입니다. 구현이 괜찮다고 보장하지 않으면 사용하지 말아야한다. 그것이'offsetof'을위한 것입니다. – StoryTeller
이 코드는 매우 혼란 스럽습니다. 당신이 일한다고 말하는 부분조차 실제로 컴파일되지 않습니다. 'Base Container :: * ptr'는 무의미한 타입의 이름이며 당신이 정말로 의미하는 것을 이해하는 것은 불가능합니다. 그리고 컴파일러 오류에 대해 묻는 코드에서는 주소가없는 것의 주소를 가져 오려고합니다. – Omnifarious