    #include <iostream>

    class Base {
    public:
      char const* address() const { return (char const*)dynamic_cast<void const*>(this); } // uses RTTI
      size_t offset() const { return this->address() - (char const*)this; }
      virtual size_t size() const { return sizeof(Base); } // to be overriden

    };

    class Derived: public Base {
    public:
      virtual size_t size() const { return sizeof(Derived); } // to be overriden
    private:
      int a;
      int b;
    };

    int main() {
      Base base;
      Derived derived;

      std::cout << (void*)&base << ": " << (void*)base.address() << ", " << base.offset() << ", " << base.size() << "\n";

      std::cout << (void*)&derived << ": " << (void*)derived.address() << ", " << derived.offset() << ", " << derived.size() << "\n";
    }