#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 Parent2{
public:
Parent2 operator=(const Parent2&) = delete;
Parent2(const Parent2&) = delete;
Parent2() = default;
Parent2(int complex) : test2(complex) {}
virtual void func2(){ cout << test2; }
private:
int test2 = 0;
};
class Child : public Parent, public Parent2{
public:
Child operator=(const Child&) = delete;
Child(const Child&) = delete;
Child(const char* parent, const char* parent2){
const auto vTablePtrSize = sizeof(void*);
const auto parentSize = sizeof(Parent);
auto charPtrThis = reinterpret_cast<char*>(this);
memcpy(charPtrThis + vTablePtrSize,
parent + vTablePtrSize,
parentSize - vTablePtrSize);
memcpy(charPtrThis + parentSize + vTablePtrSize,
parent2 + vTablePtrSize,
sizeof(Parent2) - vTablePtrSize);
}
virtual void func(){ cout << "Child, parent says: "; Parent::func(); }
virtual void func2(){ cout << "Child, parent2 says: "; Parent2::func2(); }
};
int main() {
Parent foo(13);
Parent2 foo2(42);
Child bar(reinterpret_cast<char*>(&foo), reinterpret_cast<char*>(&foo2));
bar.func();
bar.func2();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFBhcmVudHsKcHVibGljOgoJUGFyZW50IG9wZXJhdG9yPShjb25zdCBQYXJlbnQmKSA9IGRlbGV0ZTsKCVBhcmVudChjb25zdCBQYXJlbnQmKSA9IGRlbGV0ZTsKCVBhcmVudCgpID0gZGVmYXVsdDsKCVBhcmVudChpbnQgY29tcGxleCkgOiB0ZXN0KGNvbXBsZXgpIHt9CgoJdmlydHVhbCB2b2lkIGZ1bmMoKXsgY291dCA8PCB0ZXN0OyB9CnByaXZhdGU6CglpbnQgdGVzdCA9IDA7Cn07CgpjbGFzcyBQYXJlbnQyewpwdWJsaWM6CglQYXJlbnQyIG9wZXJhdG9yPShjb25zdCBQYXJlbnQyJikgPSBkZWxldGU7CglQYXJlbnQyKGNvbnN0IFBhcmVudDImKSA9IGRlbGV0ZTsKCVBhcmVudDIoKSA9IGRlZmF1bHQ7CglQYXJlbnQyKGludCBjb21wbGV4KSA6IHRlc3QyKGNvbXBsZXgpIHt9CgoJdmlydHVhbCB2b2lkIGZ1bmMyKCl7IGNvdXQgPDwgdGVzdDI7IH0KcHJpdmF0ZToKCWludCB0ZXN0MiA9IDA7Cn07CgpjbGFzcyBDaGlsZCA6IHB1YmxpYyBQYXJlbnQsIHB1YmxpYyBQYXJlbnQyewpwdWJsaWM6CglDaGlsZCBvcGVyYXRvcj0oY29uc3QgQ2hpbGQmKSA9IGRlbGV0ZTsKCUNoaWxkKGNvbnN0IENoaWxkJikgPSBkZWxldGU7CiAgICBDaGlsZChjb25zdCBjaGFyKiBwYXJlbnQsIGNvbnN0IGNoYXIqIHBhcmVudDIpewogICAgCWNvbnN0IGF1dG8gdlRhYmxlUHRyU2l6ZSA9IHNpemVvZih2b2lkKik7CiAgICAJY29uc3QgYXV0byBwYXJlbnRTaXplID0gc2l6ZW9mKFBhcmVudCk7CiAgICAJYXV0byBjaGFyUHRyVGhpcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpOwogICAgCQogICAgCW1lbWNweShjaGFyUHRyVGhpcyArIHZUYWJsZVB0clNpemUsCiAgICAJICAgICAgIHBhcmVudCArIHZUYWJsZVB0clNpemUsCiAgICAJICAgICAgIHBhcmVudFNpemUgLSB2VGFibGVQdHJTaXplKTsKICAgIAkgICAgICAgCiAgICAgICAgbWVtY3B5KGNoYXJQdHJUaGlzICsgcGFyZW50U2l6ZSArIHZUYWJsZVB0clNpemUsCiAgICAgICAgICAgICAgIHBhcmVudDIgKyB2VGFibGVQdHJTaXplLAogICAgICAgICAgICAgICBzaXplb2YoUGFyZW50MikgLSB2VGFibGVQdHJTaXplKTsKCX0KCgl2aXJ0dWFsIHZvaWQgZnVuYygpeyBjb3V0IDw8ICJDaGlsZCwgcGFyZW50IHNheXM6ICI7IFBhcmVudDo6ZnVuYygpOyB9Cgl2aXJ0dWFsIHZvaWQgZnVuYzIoKXsgY291dCA8PCAiQ2hpbGQsIHBhcmVudDIgc2F5czogIjsgUGFyZW50Mjo6ZnVuYzIoKTsgfQp9OwoKCgppbnQgbWFpbigpIHsKCVBhcmVudCBmb28oMTMpOwoJUGFyZW50MiBmb28yKDQyKTsKCUNoaWxkIGJhcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmZm9vKSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmZvbzIpKTsKCgliYXIuZnVuYygpOwoJYmFyLmZ1bmMyKCk7CgoJcmV0dXJuIDA7Cn0=