0

次のような状況があります

class Interface {
};

class ComplicatedObject : public Interface {
};

私は複雑なオブジェクトの単純化されたバージョンを提供したいと思いますが、インターフェイスは引き続き提供します。などの私的継承を考えていました

class Simplified : private ComplicatedObject {
};

もちろん、次のようなインターフェイスに簡単にアップキャストすることはできません

int main() {
  Interface* p = new Simplified();
}

コンポジションだけが唯一の方法ですか?またはいくつかの回避策はありますか?暗黙の変換のように

4

1 に答える 1

1

コンポジションだけが唯一の方法ですか?

アップキャストはコンポジションでも機能しません。プライベート継承は、クラスの外側の観点から効果的に合成されます。

またはいくつかの回避策はありますか?

暗黙的ではありませんが、ベースへの参照を返す一連のメンバー関数を提供できます。


より抜本的な (しかしより賢明な) 変更は、前提を変更して仮想継承を使用することです。

class Interface {};

class ComplicatedObject : public virtual Interface {};

class Simplified : private ComplicatedObject, public virtual Interface {};

これは仮想継承なしでも実行できますが、その場合、すべての仮想関数を再実装し、明示的にプライベート ベースに委譲する必要があります。

于 2020-10-28T17:23:04.553 に答える