c++ указатель на член (указатель на базовый класс члена)

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;

Есть ли какой-либо допустимый метод для получения указателя на базу с использованием указателя на член?


person Vadim Kobyzev    schedule 12.10.2017    source источник
comment
Вы разыменовываете nullptr, поэтому код имеет неопределенное поведение. Возможно, вам нужен offsetof.   -  person nwp    schedule 12.10.2017
comment
Этот reinterpret_cast(0) официально является UB. Вы не должны использовать его, если реализация не гарантирует, что это нормально. Вот для чего нужен offsetof.   -  person StoryTeller - Unslander Monica    schedule 12.10.2017
comment
Этот код очень запутан. Даже те части, которые, как вы говорите, работают, на самом деле не компилируются. Base Container::* ptr — это бессмысленное имя типа, и невозможно понять, что вы на самом деле имеете в виду. А в коде, где вы спрашиваете об ошибке компилятора, вы пытаетесь получить адрес чего-то, у чего даже адреса нет.   -  person Omnifarious    schedule 12.10.2017
comment
Из вашего примера &Container::f2 не могу получить доступ, который в любом случае f2 является закрытым в классе - доступ по умолчанию для класса, частный.   -  person Samer Tufail    schedule 12.10.2017
comment
Я думаю, вам нужно переосмыслить дизайн   -  person Ed Heal    schedule 12.10.2017
comment
Это было бы намного проще, если бы вы описали, чего вы пытаетесь достичь.   -  person Beached    schedule 12.10.2017
comment
Контейнер имеет множество элементов Derived*. Каждый из них имеет уникальное значение Base::type. Я хочу иметь массив смещений производных объектов к их базовым частям. Я реализовал это с помощью логики, похожей на offsetof (к сожалению, я не могу использовать offsetof), но мне это не нравится. Может быть лучший способ использовать функцию указателя на член, но похоже, что для этого требуется напрямую определить указатель на член производного класса. Мне просто интересно, знает ли кто-нибудь, как использовать здесь базовый класс, или знает, что это невозможно.   -  person Vadim Kobyzev    schedule 12.10.2017


Ответы (1)


Очень вероятно, что вы ищете смещение и весь связанный с ним персонал Как рассчитать смещение члена класса во время компиляции?

person Yury Schkatula    schedule 12.10.2017