#include <iostream>
using namespace std;
struct A {
int a;
};
struct B {
int b;
};
struct C: A, B {
int c;
};
struct Base {
virtual B* func() = 0;
virtual ~Base() = default;
};
struct Derived: Base {
C* func() {
auto p = new C;
cout << p << endl;
return p;
}
};
int main() {
Base* pb = new Derived;
cout << pb->func() << endl;
// the outputed two addresses are different.
// how is the pointer cast (adding some offset) achieved?
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBIHsKICBpbnQgYTsKfTsKCnN0cnVjdCBCIHsKICBpbnQgYjsKfTsKCnN0cnVjdCBDOiBBLCBCIHsKICBpbnQgYzsKfTsKCgpzdHJ1Y3QgQmFzZSB7CiAgdmlydHVhbCBCKiBmdW5jKCkgPSAwOwogIHZpcnR1YWwgfkJhc2UoKSA9IGRlZmF1bHQ7Cn07CgpzdHJ1Y3QgRGVyaXZlZDogQmFzZSB7CiAgQyogZnVuYygpIHsKICAgIGF1dG8gcCA9IG5ldyBDOwogICAgY291dCA8PCBwIDw8IGVuZGw7CiAgICByZXR1cm4gcDsKICB9Cn07CgoKaW50IG1haW4oKSB7CiAgQmFzZSogcGIgPSBuZXcgRGVyaXZlZDsKICBjb3V0IDw8ICBwYi0+ZnVuYygpIDw8IGVuZGw7CiAgLy8gdGhlIG91dHB1dGVkIHR3byBhZGRyZXNzZXMgYXJlIGRpZmZlcmVudC4KICAvLyBob3cgaXMgdGhlIHBvaW50ZXIgY2FzdCAoYWRkaW5nIHNvbWUgb2Zmc2V0KSBhY2hpZXZlZD8KfQo=