#include <iostream>
#include <cstring>
using namespace std;
class Parent{
public:
Parent operator=(const Parent&) = delete;
Parent(const Parent&) = delete;
Parent() = default;
Parent(int complex) : test(complex) {}
virtual void func(){ cout << test; }
private:
int test = 0;
};
class Child : public Parent{
public:
Child operator=(const Child&) = delete;
Child(const Child&) = delete;
Child(const Parent* parent){
const auto vTablePtrSize = sizeof(void*);
memcpy(reinterpret_cast<char*>(this) + vTablePtrSize,
reinterpret_cast<const char*>(parent) + vTablePtrSize,
sizeof(Parent) - vTablePtrSize);
}
virtual void func(){ cout << "Child, parent says: "; Parent::func(); }
};
int main() {
Parent foo(13);
Child bar(&foo);
bar.func();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFBhcmVudHsKcHVibGljOgoJUGFyZW50IG9wZXJhdG9yPShjb25zdCBQYXJlbnQmKSA9IGRlbGV0ZTsKCVBhcmVudChjb25zdCBQYXJlbnQmKSA9IGRlbGV0ZTsKCVBhcmVudCgpID0gZGVmYXVsdDsKCVBhcmVudChpbnQgY29tcGxleCkgOiB0ZXN0KGNvbXBsZXgpIHt9CgoJdmlydHVhbCB2b2lkIGZ1bmMoKXsgY291dCA8PCB0ZXN0OyB9CnByaXZhdGU6CglpbnQgdGVzdCA9IDA7Cn07CgpjbGFzcyBDaGlsZCA6IHB1YmxpYyBQYXJlbnR7CnB1YmxpYzoKCUNoaWxkIG9wZXJhdG9yPShjb25zdCBDaGlsZCYpID0gZGVsZXRlOwoJQ2hpbGQoY29uc3QgQ2hpbGQmKSA9IGRlbGV0ZTsKICAgIENoaWxkKGNvbnN0IFBhcmVudCogcGFyZW50KXsKICAgIAljb25zdCBhdXRvIHZUYWJsZVB0clNpemUgPSBzaXplb2Yodm9pZCopOwogICAgCQogICAgCW1lbWNweShyZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzKSArIHZUYWJsZVB0clNpemUsCiAgICAJICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBhcmVudCkgKyB2VGFibGVQdHJTaXplLAogICAgCSAgICAgICBzaXplb2YoUGFyZW50KSAtIHZUYWJsZVB0clNpemUpOwoJfQoKCXZpcnR1YWwgdm9pZCBmdW5jKCl7IGNvdXQgPDwgIkNoaWxkLCBwYXJlbnQgc2F5czogIjsgUGFyZW50OjpmdW5jKCk7IH0KfTsKCmludCBtYWluKCkgewoJUGFyZW50IGZvbygxMyk7CglDaGlsZCBiYXIoJmZvbyk7CgoJYmFyLmZ1bmMoKTsKCglyZXR1cm4gMDsKfQ==