#include <iostream>
#include <stdio.h>
using namespace std;
struct vtbltest
{
virtual int testvirt()
{
return 666;
}
};
template <class T>
struct clearable
{
void *cleared;
clearable():cleared(calloc(sizeof(T), 1)) {}
void clear()
{
*((T*)this) = *((T*)cleared);
};
};
class test : public clearable<test>, public vtbltest
{
public:
int a;
};
class test2 : public clearable<test>, public vtbltest
{
public:
int testvirt()
{
return 976;
}
int a;
};
int main() {
test _test;
_test.a=3;
_test.clear();
printf("%d, %d\n", _test.a, _test.testvirt());
test2 _test2;
_test2.a=3;
_test2.clear();
printf("%d, %d\n", _test2.a, _test2.testvirt());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCB2dGJsdGVzdAp7Cgl2aXJ0dWFsIGludCB0ZXN0dmlydCgpCgl7CgkJcmV0dXJuIDY2NjsKCX0KfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgY2xlYXJhYmxlCnsKCXZvaWQgKmNsZWFyZWQ7CgljbGVhcmFibGUoKTpjbGVhcmVkKGNhbGxvYyhzaXplb2YoVCksIDEpKSB7fQoJCgl2b2lkIGNsZWFyKCkKCXsKCSAgICAqKChUKil0aGlzKSA9ICooKFQqKWNsZWFyZWQpOwoJfTsKfTsKCmNsYXNzIHRlc3QgOiBwdWJsaWMgY2xlYXJhYmxlPHRlc3Q+LCBwdWJsaWMgdnRibHRlc3QKewoJcHVibGljOgoJCWludCBhOwp9OwoKY2xhc3MgdGVzdDIgOiBwdWJsaWMgY2xlYXJhYmxlPHRlc3Q+LCBwdWJsaWMgdnRibHRlc3QKewoJcHVibGljOgoJCWludCB0ZXN0dmlydCgpCgkJewoJCQlyZXR1cm4gOTc2OwoJCX0KCQkKCQlpbnQgYTsKfTsKCmludCBtYWluKCkgewoJdGVzdCBfdGVzdDsKCV90ZXN0LmE9MzsKCV90ZXN0LmNsZWFyKCk7CglwcmludGYoIiVkLCAlZFxuIiwgX3Rlc3QuYSwgX3Rlc3QudGVzdHZpcnQoKSk7CgkKCXRlc3QyIF90ZXN0MjsKCV90ZXN0Mi5hPTM7CglfdGVzdDIuY2xlYXIoKTsKCXByaW50ZigiJWQsICVkXG4iLCBfdGVzdDIuYSwgX3Rlc3QyLnRlc3R2aXJ0KCkpOwoKCXJldHVybiAwOwp9Cg==