#include <iostream>
#include <string>
struct Base
{
std::string s = "acid";
virtual ~Base(){}
virtual void Print() const
{
std::cout << "Base: " << s << std::endl;
}
};
struct Derived : Base
{
Derived(){ Base::s = "neutral"; }
virtual ~Derived(){}
virtual void Print() const
{
std::cout << "Derived: " << Base::s << std::endl;
}
};
int main()
{
std::cout << "sizeof(Base) = " << sizeof(Base) << std::endl;
std::cout << "sizeof(Derived) = " << sizeof(Derived) << std::endl;
Base *r1 = new Base;
Base *r2 = new Derived;
r1->Print();
r2->Print();
r1->~Base();
r2->~Base();
new ((void*)r1) Derived;
new ((void*)r2) Base;
r1->Print();
r2->Print();
delete r1;
delete r2;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgogCnN0cnVjdCBCYXNlCnsKICAgIHN0ZDo6c3RyaW5nIHMgPSAiYWNpZCI7CiAgICB2aXJ0dWFsIH5CYXNlKCl7fQogICAgdmlydHVhbCB2b2lkIFByaW50KCkgY29uc3QKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2U6ICIgPDwgcyA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CiAKc3RydWN0IERlcml2ZWQgOiBCYXNlCnsKICAgIERlcml2ZWQoKXsgQmFzZTo6cyA9ICJuZXV0cmFsIjsgfQogICAgdmlydHVhbCB+RGVyaXZlZCgpe30KICAgIHZpcnR1YWwgdm9pZCBQcmludCgpIGNvbnN0CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJEZXJpdmVkOiAiIDw8IEJhc2U6OnMgPDwgc3RkOjplbmRsOwogICAgfQp9OwogCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8ICJzaXplb2YoQmFzZSkgPSAiIDw8IHNpemVvZihCYXNlKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgInNpemVvZihEZXJpdmVkKSA9ICIgPDwgc2l6ZW9mKERlcml2ZWQpIDw8IHN0ZDo6ZW5kbDsKCiAgICBCYXNlICpyMSA9IG5ldyBCYXNlOwogICAgQmFzZSAqcjIgPSBuZXcgRGVyaXZlZDsKIAogICAgcjEtPlByaW50KCk7CiAgICByMi0+UHJpbnQoKTsKIAogICAgcjEtPn5CYXNlKCk7CiAgICByMi0+fkJhc2UoKTsKICAgIG5ldyAoKHZvaWQqKXIxKSBEZXJpdmVkOwogICAgbmV3ICgodm9pZCopcjIpIEJhc2U7CiAKICAgIHIxLT5QcmludCgpOwogICAgcjItPlByaW50KCk7CiAgICAKICAgIGRlbGV0ZSByMTsKICAgIGRlbGV0ZSByMjsKfQ==