1

基本クラス (クラス A) から派生したクラス (クラス B) があります。クラス A には、派生クラスでオーバーライドしてプライベートとして使用したい保護された仮想関数 foo() があります。

Class A{
  protected:
   virtual void foo() = 0;
}

私は次のことを疑問に思っています

Class B: public Class A
  private:
    virtual void foo();

Class B: private Class A
  private:
    virtual void foo();

同じだ。

4

3 に答える 3

1

それらは同じではありません。最初の例でB は is-an -Aですが、2 番目の例ではそうではありません。したがって、最初のケースでは、次のようなコードを持つことができます

void foo(const A& a);

AおよびBを引数として受け入れます。プライベート継承では、それができませんでした。例えば、

A a;
B b;
foo(a); // OK with private and public inheritance
foo(b); // OK only with public inheritance, i.e. B is an A.
于 2013-10-14T13:07:13.610 に答える
0

どちらも同じではありません public 継承では、クラス A の foo() はクラス B で保護されたメンバーになります private 継承では、クラス B はクラス A の public メンバーにのみアクセスできるため、クラス B にはクラス A の foo() は存在しません.

于 2013-10-14T13:38:10.837 に答える
0

いいえ、あなたの 2 つのケースは同じではありません。

2 番目のケースでは、プライベート基本クラスが隠されているため、class Bにキャストできません。class Aこの点では、class Aが のメンバーであるかのように動作しclass Bます。

于 2013-10-14T13:11:33.563 に答える