Rust の trait は associated types をメソッドの戻り値に使えるから、 C++ の仮想関数が派生クラスでも同じ型を返さないといけないのよりも実は自由度が高いのよね。
それで何が嬉しいかというと、メソッドチェーンを真っ当に (静的に) 実装しやすくなる
C++ だと妥協して
virtual std::unique_ptr<Base> foo() override
みたいな実装にする必要があったところで、 Rust なら
fn foo(&self) -> Self::Foo
とできる
というかイテレータ (std::iter::Iterator) はまさにそういう設計になってる。
同じことを C++ で (動的メモリアロケーションなしで) やろうとすると、実は継承と仮想関数を使ってもたぶんうまくいかない