>>36
duplicateをどういうものにしたいのかわからないけど(Derived*を返す必要が本当にあるのか?)
基底クラスのpublicな非仮想メンバ関数を派生クラスで再定義・隠蔽するのはNVIではないよ

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 {
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base * b1(new Base);
Base * b2(new Derived);
Derived * d(new Derived);

b1->duplicate()->put();
b2->duplicate()->put();
d->duplicate()->put();

delete d;
delete b2;
delete b1;
}