class A
{
/* ... */
public:
virtual int method1(int x) = 0;
virtual ~A() {}
};
class B : public A
{
/* ... */
public:
virtual int method1(int x) {
return method2(x);
}
virtual int method2(int y) {
return y;
}
/* ... */
};
class C : public virtual B
{
/* ... */
};
class D : public B
{
/* ... */
public:
virtual int method2(int y) {
return y * 2;
}
/* ... */
};
#include <iostream>
#include <memory>
int main() {
std::auto_ptr<A> const b(new B);
std::cout << b->method1(1) << std::endl;
std::auto_ptr<A> const d(new D);
std::cout << d->method1(1) << std::endl;
}
Y2xhc3MgQQp7Ci8qIC4uLiAqLwpwdWJsaWM6CiAgIHZpcnR1YWwgaW50IG1ldGhvZDEoaW50IHgpID0gMDsKCiAgIHZpcnR1YWwgfkEoKSB7fQp9OwoKY2xhc3MgQiA6IHB1YmxpYyBBCnsKICAgIC8qIC4uLiAqLwpwdWJsaWM6CiAgICB2aXJ0dWFsIGludCBtZXRob2QxKGludCB4KSB7CiAgICAgICByZXR1cm4gbWV0aG9kMih4KTsKICAgIH0KICAgIHZpcnR1YWwgaW50IG1ldGhvZDIoaW50IHkpIHsKICAgICAgIHJldHVybiB5OwogICAgfQogICAgLyogLi4uICovCn07CgpjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgQgp7CiAgICAvKiAuLi4gKi8KfTsKCmNsYXNzIEQgOiBwdWJsaWMgQgp7CiAgICAvKiAuLi4gKi8KcHVibGljOgogICAgdmlydHVhbCBpbnQgbWV0aG9kMihpbnQgeSkgewogICAgICAgcmV0dXJuIHkgKiAyOwogICAgfQogICAgLyogLi4uICovCn07CgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKCmludCBtYWluKCkgewogICBzdGQ6OmF1dG9fcHRyPEE+IGNvbnN0IGIobmV3IEIpOwogICBzdGQ6OmNvdXQgPDwgYi0+bWV0aG9kMSgxKSA8PCBzdGQ6OmVuZGw7CgogICBzdGQ6OmF1dG9fcHRyPEE+IGNvbnN0IGQobmV3IEQpOwogICBzdGQ6OmNvdXQgPDwgZC0+bWV0aG9kMSgxKSA8PCBzdGQ6OmVuZGw7Cn0=