Consider this:
class Base {};    
class A : public Base {};
class B : public Base {};
class C : public Base {};
class D : public Base {};
class Obj
{
public:
    Obj(const Obj&);
private:
    A _a;
    B _b;
    C _c;
    D _d;
    Base *_current;
};
_current always points to one of _a, _b, _c, or _d. A, B, C, and D can have difference sizes. I want to implement Obj(const Obj&) so that _current of the copy points to the appropriate member in itself.
Is this approach safe:
Obj::Obj(const Obj& obj) :
    _a {obj._a},
    _b {obj._b},
    _c {obj._c},
    _d {obj._d}
{
    auto objAAddr = reinterpret_cast<const char *>(&obj._a);
    auto objCurAddr = reinterpret_cast<const char *>(obj._current);
    auto diff = objCurAddr - objAAddr;
    auto myAAddr = reinterpret_cast<char *>(&_a);
    _current = reinterpret_cast<Base *>(myAAddr + diff);
}
The "base" address could be something else than _a's here, like &_obj (and then apply difference to this).
Is there a better/cleaner alternative?
 
     
    