#include <iostream>
using namespace std;
class interface_d
{
public:
virtual ~interface_d() {}
};
class d1
: public interface_d
{
public:
d1() : interface_d(), m_x(new int) {}
virtual ~d1()
{
delete m_x;
}
private:
int *m_x;
};
class base
{
public:
base(interface_d *impl) : m_impl(impl) {}
virtual ~base()
{
// ... do something before clear impl
delete m_impl;
// ... do something after clear impl
}
private:
interface_d *m_impl;
};
int main() {
base x(new d1);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgaW50ZXJmYWNlX2QKewpwdWJsaWM6Cgl2aXJ0dWFsIH5pbnRlcmZhY2VfZCgpIHt9Cn07CgpjbGFzcyBkMQoJOiBwdWJsaWMgaW50ZXJmYWNlX2QKewpwdWJsaWM6CglkMSgpIDogaW50ZXJmYWNlX2QoKSwgbV94KG5ldyBpbnQpIHt9Cgl2aXJ0dWFsIH5kMSgpCgl7CgkJZGVsZXRlIG1feDsKCX0KCnByaXZhdGU6CglpbnQgKm1feDsKfTsKCmNsYXNzIGJhc2UKewpwdWJsaWM6CgliYXNlKGludGVyZmFjZV9kICppbXBsKSA6IG1faW1wbChpbXBsKSB7fQoJdmlydHVhbCB+YmFzZSgpCgl7CgkJLy8gLi4uIGRvIHNvbWV0aGluZyBiZWZvcmUgY2xlYXIgaW1wbAoJCWRlbGV0ZSBtX2ltcGw7CgkJLy8gLi4uIGRvIHNvbWV0aGluZyBhZnRlciBjbGVhciBpbXBsCgl9Cgpwcml2YXRlOgoJaW50ZXJmYWNlX2QgKm1faW1wbDsKfTsKCmludCBtYWluKCkgewoJYmFzZSB4KG5ldyBkMSk7CglyZXR1cm4gMDsKfQ==