これでOKでしたありがとうございました

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->duplicate()->put();
d->duplicate()->put();

delete d;
delete b;
}