君の知らないprivate継承

1798 ワード

C++のクラスには多くの継承方法がありますが、ソフトウェアの設計とコードの作成で最も多く使われているのはpublic継承で、private継承に触れることはめったにありません.しかし、私たちはデザインの时に本当にいつpublicで継承すべきか、いつpublicで継承すべきか、いつpublicで継承すべきではないかを考えたことがあります.いつ私たちによく忘れられている知識を考えて、忘れられた隅から光を拾い直しましょう.例えばprivate継承.
As we all know,public継承はis‐a関係を成形するものである.is-aの関係とは何ですか?Effective C++は、class Dにpublic形式でclass Bを継承させると、各タイプがDのオブジェクトは同時にタイプがBのオブジェクトであり、逆に成立しないと説明しています.BはDより一般化された概念を示し、DはBより特殊化された概念を示すという意味だ.「Bオブジェクトが役に立つところは、Dオブジェクトと同じように役に立つ」と主張します.それぞれのDオブジェクトはBオブジェクトですから.逆にDオブジェクトが必要な場合は、Bオブジェクトはサービスできません.
また,我々が好むvirtual関数,すなわち動作動態もpublic継承に基づいている.
私がC++を学んだばかりの頃は、privateの継承だけを知っていて、継承してきたメンバー(publicメンバーとprotectedメンバー)をprivateにして、何かもっと深い意味と役割があるかどうかは考えていませんでしたが、当然、これらのメンバーがその後のサブクラスに継承されたくないと思っていました.ではprivate継承はいったい何を意味するのでしょうか??
まず、次のコードを見てみましょう.
class Person{...};
class Student:private Person{...};
void eat(const Person &p);
Person p;
Student s;
eat(p);//  
eat(s);//  !!!

Effective C++の言い方を見てみましょう.
classes間の継承関係がprivateの場合、コンパイラはdeirved classオブジェクトをbase classオブジェクトに自動的に変換しません.!!!
private継承はimplemented-in-terms-of(あるものによって実現される)を意味する.class Dにprivateでclass Bを継承させる場合は、BオブジェクトとDオブジェクトに観念的な関係があるためではなく、class B内のいくつかの特性を採用することを目的としています.private継承は純粋に実装技術であり、実装部分のみが継承されることを意味し、インタフェース部分は省略すべきである.Dがprivate形式でBを継承する場合、DオブジェクトはBオブジェクトによって実現されることを意味し、private継承はソフトウェア設計の面で意味がなく、その意味はソフトウェア実現の面にしか及ばない.
privateは少しhas-aの感じがします.その意味は複合の意味と同じである.では、私たちの問題はまた発生しました.いつ複合でいつprivateで継承しますか.答えは簡単で、できるだけ複合を使います.以下の2つのケースを除きます.
1、private継承は通常複合のレベルより低い.ただし、derived classがprotected base classのメンバーにアクセスする必要がある場合、または継承されたvirtual関数を再定義する必要がある場合はprivateで継承します.
2、private継承はempty class最適化をもたらすことができる.
http://blog.csdn.net/ljianhui/article/details/8096752