#include <cstdio>
#include <memory>
#define KNOTE(fmt, args...) ::printf(fmt "\n", ##args)
using namespace std;
class TBase
{
public:
TBase()
: IntValue(-1) {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
virtual ~TBase() {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
int IntValue;
};
class TDerived : public TBase
{
public:
TDerived() {
IntValue = 10;
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
virtual ~TDerived() {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
};
void TestUniquePtrInheritance()
{
{
std::unique_ptr<TDerived> dp1(new TDerived); // TBase: -1
// TDerived: 10
std::unique_ptr<TBase> bp1 = std::move(dp1);
std::unique_ptr<TBase> bp2(std::move(bp1));
std::unique_ptr<TBase> bp3(new TDerived); // TBase: -1
// TDerived: 10
bp2->IntValue = 20;
}
// ~TDerived: 10
// ~TBase: 10
// ~TDerived: 20
// ~TBase: 20
}
int main()
{
TestUniquePtrInheritance();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KIAojZGVmaW5lIEtOT1RFKGZtdCwgYXJncy4uLikgOjpwcmludGYoZm10ICJcbiIsICMjYXJncykKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjbGFzcyBUQmFzZQp7CnB1YmxpYzoKVEJhc2UoKQo6IEludFZhbHVlKC0xKSB7CktOT1RFKCIlc0AlcDogJWQiLCBfX2Z1bmNfXywgdGhpcywgSW50VmFsdWUpOwp9CnZpcnR1YWwgflRCYXNlKCkgewpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQppbnQgSW50VmFsdWU7Cn07CiAKY2xhc3MgVERlcml2ZWQgOiBwdWJsaWMgVEJhc2UKewpwdWJsaWM6ClREZXJpdmVkKCkgewpJbnRWYWx1ZSA9IDEwOwpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQp2aXJ0dWFsIH5URGVyaXZlZCgpIHsKS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7Cn0KfTsKCnZvaWQgVGVzdFVuaXF1ZVB0ckluaGVyaXRhbmNlKCkKewogIHsKICAgIHN0ZDo6dW5pcXVlX3B0cjxURGVyaXZlZD4gZHAxKG5ldyBURGVyaXZlZCk7IC8vIFRCYXNlOiAtMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVERlcml2ZWQ6IDEwCiAgICBzdGQ6OnVuaXF1ZV9wdHI8VEJhc2U+IGJwMSA9IHN0ZDo6bW92ZShkcDEpOwogICAgc3RkOjp1bmlxdWVfcHRyPFRCYXNlPiBicDIoc3RkOjptb3ZlKGJwMSkpOwogICAgc3RkOjp1bmlxdWVfcHRyPFRCYXNlPiBicDMobmV3IFREZXJpdmVkKTsgLy8gVEJhc2U6IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBURGVyaXZlZDogMTAKICAgIGJwMi0+SW50VmFsdWUgPSAyMDsKICB9Ci8vIH5URGVyaXZlZDogMTAKLy8gflRCYXNlOiAxMAovLyB+VERlcml2ZWQ6IDIwCi8vIH5UQmFzZTogMjAKfQoKaW50IG1haW4oKQp7ClRlc3RVbmlxdWVQdHJJbmhlcml0YW5jZSgpOwpyZXR1cm4gMDsKfQ==