#include <iostream>
using namespace std;
template < class T>
class IDetachable {
public :
virtual T* detached( ) const = 0 ;
} ;
class A: public IDetachable< A> {
virtual A* detached( ) const override {
cout << "some implementation which returns a detached A object" << endl;
}
} ;
class B: public A, public IDetachable< B> {
virtual B* detached( ) const override {
cout << "some implementation which returns a detached B object" << endl;
}
} ;
int main( ) {
IDetachable< A> * da = new A;
A * a = da- > detached( ) ;
IDetachable< B> * db = new B;
A * ba = db- > detached( ) ;
B * bb = db- > detached( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIElEZXRhY2hhYmxlIHsKcHVibGljOgogICAgdmlydHVhbCBUKiBkZXRhY2hlZCgpIGNvbnN0ID0gMDsKfTsKCgpjbGFzcyBBOiBwdWJsaWMgSURldGFjaGFibGU8QT4gewogICAgdmlydHVhbCBBKiBkZXRhY2hlZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICBjb3V0IDw8ICJzb21lIGltcGxlbWVudGF0aW9uIHdoaWNoIHJldHVybnMgYSBkZXRhY2hlZCBBIG9iamVjdCIgPDwgZW5kbDsKICAgIH0KfTsKCmNsYXNzIEI6IHB1YmxpYyBBLCBwdWJsaWMgSURldGFjaGFibGU8Qj4gewogICAgdmlydHVhbCBCKiBkZXRhY2hlZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICBjb3V0IDw8ICJzb21lIGltcGxlbWVudGF0aW9uIHdoaWNoIHJldHVybnMgYSBkZXRhY2hlZCBCIG9iamVjdCIgPDwgZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgSURldGFjaGFibGU8QT4gKmRhID0gbmV3IEE7CiAgICBBICphID0gZGEtPmRldGFjaGVkKCk7CiAgICBJRGV0YWNoYWJsZTxCPiAqZGIgPSBuZXcgQjsKICAgIEEgKmJhID0gZGItPmRldGFjaGVkKCk7CiAgICBCICpiYiA9IGRiLT5kZXRhY2hlZCgpOwp9