#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 TestSharedPtrInheritance()
{
{
std::shared_ptr<TDerived> dp1(new TDerived); // TBase: -1
// TDerived: 10
std::shared_ptr<TBase> bp1 = dp1;
std::shared_ptr<TBase> bp2(dp1);
std::shared_ptr<TBase> bp3(new TDerived); // TBase: -1
// TDerived: 10
bp2->IntValue = 20;
}
// ~TDerived: 10
// ~TBase: 10
// ~TDerived: 20
// ~TBase: 20
}
int main()
{
TestSharedPtrInheritance();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KCiNkZWZpbmUgS05PVEUoZm10LCBhcmdzLi4uKSA6OnByaW50ZihmbXQgIlxuIiwgIyNhcmdzKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVEJhc2UKewpwdWJsaWM6CiAgVEJhc2UoKQogICAgOiBJbnRWYWx1ZSgtMSkgewogICAgS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7CiAgfQogIHZpcnR1YWwgflRCYXNlKCkgewogICAgS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7CiAgfQogIGludCBJbnRWYWx1ZTsKfTsKCmNsYXNzIFREZXJpdmVkIDogcHVibGljIFRCYXNlCnsKcHVibGljOgogIFREZXJpdmVkKCkgewogICAgSW50VmFsdWUgPSAxMDsKICAgIEtOT1RFKCIlc0AlcDogJWQiLCBfX2Z1bmNfXywgdGhpcywgSW50VmFsdWUpOwogIH0KICB2aXJ0dWFsIH5URGVyaXZlZCgpIHsKICAgIEtOT1RFKCIlc0AlcDogJWQiLCBfX2Z1bmNfXywgdGhpcywgSW50VmFsdWUpOwogIH0KfTsKCnZvaWQgVGVzdFNoYXJlZFB0ckluaGVyaXRhbmNlKCkKewogIHsKICAgIHN0ZDo6c2hhcmVkX3B0cjxURGVyaXZlZD4gZHAxKG5ldyBURGVyaXZlZCk7IC8vIFRCYXNlOiAtMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVERlcml2ZWQ6IDEwCiAgICBzdGQ6OnNoYXJlZF9wdHI8VEJhc2U+IGJwMSA9IGRwMTsKICAgIHN0ZDo6c2hhcmVkX3B0cjxUQmFzZT4gYnAyKGRwMSk7CiAgICBzdGQ6OnNoYXJlZF9wdHI8VEJhc2U+IGJwMyhuZXcgVERlcml2ZWQpOyAvLyBUQmFzZTogLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFREZXJpdmVkOiAxMAogICAgYnAyLT5JbnRWYWx1ZSA9IDIwOwogIH0KLy8gflREZXJpdmVkOiAxMAovLyB+VEJhc2U6IDEwCi8vIH5URGVyaXZlZDogMjAKLy8gflRCYXNlOiAyMAp9CgppbnQgbWFpbigpCnsKICBUZXN0U2hhcmVkUHRySW5oZXJpdGFuY2UoKTsKICByZXR1cm4gMDsKfQ==