#include <iostream>
struct Base {
virtual ~Base() {
std::cout << "Base destructor\n";
}
virtual void sayHi() {
std::cout << "Base says hi\n";
}
};
struct Derived : Base {
~Derived() override {
std::cout << "Derived destructor\n";
}
void sayHi() override {
std::cout << "Derived says hi\n";
}
};
struct Container {
Derived derivedMember;
Base& baseRef;
Container() : baseRef(derivedMember) {}
~Container() {
std::cout << "Container destructor\n";
// No explicit virtual call here!
}
};
Container globalContainer;
int main() {
std::cout << "Main start\n";
// No explicit use
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UgewogICAgdmlydHVhbCB+QmFzZSgpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2UgZGVzdHJ1Y3RvclxuIjsKICAgIH0KICAgIHZpcnR1YWwgdm9pZCBzYXlIaSgpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2Ugc2F5cyBoaVxuIjsKICAgIH0KfTsKCnN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICB+RGVyaXZlZCgpIG92ZXJyaWRlIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkRlcml2ZWQgZGVzdHJ1Y3RvclxuIjsKICAgIH0KICAgIHZvaWQgc2F5SGkoKSBvdmVycmlkZSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJEZXJpdmVkIHNheXMgaGlcbiI7CiAgICB9Cn07CgpzdHJ1Y3QgQ29udGFpbmVyIHsKICAgIERlcml2ZWQgZGVyaXZlZE1lbWJlcjsKICAgIEJhc2UmIGJhc2VSZWY7CgogICAgQ29udGFpbmVyKCkgOiBiYXNlUmVmKGRlcml2ZWRNZW1iZXIpIHt9CiAgICB+Q29udGFpbmVyKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ29udGFpbmVyIGRlc3RydWN0b3JcbiI7CiAgICAgICAgLy8gTm8gZXhwbGljaXQgdmlydHVhbCBjYWxsIGhlcmUhCiAgICB9Cn07CgpDb250YWluZXIgZ2xvYmFsQ29udGFpbmVyOwoKaW50IG1haW4oKSB7CiAgICBzdGQ6OmNvdXQgPDwgIk1haW4gc3RhcnRcbiI7CiAgICAvLyBObyBleHBsaWNpdCB1c2UKICAgIHJldHVybiAwOwp9