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;
Есть ли какой-либо допустимый метод для получения указателя на базу с использованием указателя на член?
nullptr
, поэтому код имеет неопределенное поведение. Возможно, вам нуженoffsetof
. - person nwp   schedule 12.10.2017reinterpret_cast(0)
официально является UB. Вы не должны использовать его, если реализация не гарантирует, что это нормально. Вот для чего нуженoffsetof
. - person StoryTeller - Unslander Monica   schedule 12.10.2017Base Container::* ptr
— это бессмысленное имя типа, и невозможно понять, что вы на самом деле имеете в виду. А в коде, где вы спрашиваете об ошибке компилятора, вы пытаетесь получить адрес чего-то, у чего даже адреса нет. - person Omnifarious   schedule 12.10.2017&Container::f2
не могу получить доступ, который в любом случаеf2
является закрытым в классе - доступ по умолчанию для класса, частный. - person Samer Tufail   schedule 12.10.2017