#include <iostream>
using namespace std;
struct Beverage
{
static int last;
int i;
Beverage() : i(++last) {}
virtual ~Beverage() { cout << "~Beverage #" << i << endl; }
};
int Beverage::last = 0;
struct DarkRoast : Beverage
{
virtual ~DarkRoast() { cout << "~DarkRoast #" << i << endl; }
};
struct Whip : Beverage
{
Beverage &p;
Whip(Beverage &p) : p(p) {};
virtual ~Whip() { cout << "~Whip #" << i << endl; delete &p; }
};
int main()
{
Beverage * beverage2 = new DarkRoast();
beverage2 = new Whip(*beverage2);
delete beverage2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBCZXZlcmFnZQp7CiAgc3RhdGljIGludCBsYXN0OwogIGludCBpOwogIEJldmVyYWdlKCkgOiBpKCsrbGFzdCkge30KICB2aXJ0dWFsIH5CZXZlcmFnZSgpIHsgY291dCA8PCAifkJldmVyYWdlICMiIDw8IGkgPDwgZW5kbDsgIH0KfTsKCmludCBCZXZlcmFnZTo6bGFzdCA9IDA7CgpzdHJ1Y3QgRGFya1JvYXN0IDogQmV2ZXJhZ2UKewogIHZpcnR1YWwgfkRhcmtSb2FzdCgpIHsgY291dCA8PCAifkRhcmtSb2FzdCAjIiA8PCBpIDw8IGVuZGw7IH0KfTsKCnN0cnVjdCBXaGlwIDogQmV2ZXJhZ2UKewogIEJldmVyYWdlICZwOwogIFdoaXAoQmV2ZXJhZ2UgJnApIDogcChwKSB7fTsKICB2aXJ0dWFsIH5XaGlwKCkgeyBjb3V0IDw8ICJ+V2hpcCAjIiA8PCBpIDw8IGVuZGw7IGRlbGV0ZSAmcDsgfQp9OwoKaW50IG1haW4oKQp7CiAgQmV2ZXJhZ2UgKiBiZXZlcmFnZTIgPSBuZXcgRGFya1JvYXN0KCk7CiAgYmV2ZXJhZ2UyID0gbmV3IFdoaXAoKmJldmVyYWdlMik7CiAgZGVsZXRlIGJldmVyYWdlMjsKICAKICByZXR1cm4gMDsKfQ==