1

私が理解している限り、プライベート継承のために派生クラス オブジェクトを基底クラス参照に渡すことができない理由は、Derived は Base からプライベートに継承されるため、Base の既定のコンストラクターは Derived のコンストラクターの前に呼び出されるということです。しかし、これは非公開であり、Derived に継承されていないため、コンパイラ エラーが発生します。

しかし、Base のパブリック コンストラクターを作成し、Derived からプライベートに継承してから、パブリック ステータスを Base のコンストラクターに再割り当てしようとすると、派生のインスタンスを Base 参照に渡すことができますか?

以下のようにしてみましたが、

#include <iostream>

using namespace std;

class base
{
      public:
             base(){}
             void print(){ puts("In base"); }
};

class derived : private base
{
      public:
             base::base;   /* Throws an error - Declaration doesnt declare anything*/
             void print(){ puts("In derived"); }
};

void func(base& bRef)
{
}

int main()
{
    derived dObj;
    func(dObj); /*  Throws an error - 'base' is an inaccessible base of derived */
}

base::base (プライベートに継承されたコンストラクターをパブリックに公開する) に対してエラーをスローします。私が試みていることは有効ですか?誰か教えてください。

4

2 に答える 2

2

いいえ、Derived のオブジェクトを Base クラスのポインタまたは参照で指すことは無効です。可能であれば、プライベート継承の目的全体 (派生クラスが基本クラスからその機能の一部 (または全体) を継承するという事実を隠す) は役に立たないでしょう。

foo()基本クラスにメソッドがあるとします。このメソッドを呼び出したくありません。しかし、基底クラスのポインターからオブジェクトを指すことができる場合は、 を呼び出すこともできますfoo()

Base * ptrBase = &objDerived;      // Let's suppose this would compile
ptrBase->foo();                    // Now we can call foo() (?)

プライベート継承を宣言すると、派生クラスが基底クラスに関連付けられていないかのようになります。この関係が存在することを「知っている」のは開発者であるあなただけであり、実際にはそれを忘れる必要があります。

プライベート継承は、真の継承メカニズムとしてではなく、再利用メカニズムとしてのみ存在します。単純に構成を適用する (つまり、Derived でクラス Base の属性を作成する) だけでより良い結果が得られるため、使用することさえお勧めしません。

于 2012-05-07T08:00:04.743 に答える