-1

いくつかの public メソッドを持つ基本クラスがあり、特定の関数のみを継承する子クラスを派生させたいので、private 継承を使用して子クラスを派生させました。また、プライベート継承がコンテインメントとほぼ同じであることに何度か遭遇しました (C++ 入門プラスを含む)。Base で定義された関数を派生クラスで使用できるようにしたいという問題があります。

派生クラスには、基本クラスに必要なメンバー以外のプライベート メンバーはありません。コードに示されているように、派生クラスのパブリック メソッド「func」を定義する方法がわかりません。

class Base
{
private:
    double *p;
public:
    Base(int m, int n);
    void fun(const Base & obj1, const Base & obj2)
};

class Derived : private Base
{
public:
    Derived(int n) : Base(1,n) {}
    void fun(const Derived & obj1,const Base & obj2)
    {
    /* The function fun in derived class works almost exactly 
       like fun in Base class but I don't know how to call 
       Base.Fun(...). Also all the data needed to perform 
       operations in this function is a part of the private 
       member of the base class which the Derived member can't 
       access.
    */
    }
}

封じ込めを使用する場合は、次のように定義できます。

class Derived
{
private:
    Base P;
public:
    void fun(const Derived & obj1,const Base & obj2)
    {
        Base :: P.func(obj1.P,obj2);
    }
 };

これは、ここではプライベート継承よりも封じ込めの方が適切かどうか疑問に思います。一方、どちらの実装も正しいかどうかはわかりません。だから私はこれを行うための可能な方法を探しています。

上記のコードでは、コピー コンストラクター、割り当て、演算子、およびその他のメソッドを示していませんが、それらの要件は認識しています。コードは、プライベートな継承と封じ込めを示すという基本的な目的を果たすためのものです。

4

1 に答える 1

1

Derived の fun メソッドが Base のプライベート メンバーに直接アクセスすることによってのみ実装できる場合、継承も包含も Derived がそれらのメソッドにアクセスすることを許可しません。継承を使用すると、メンバーを保護する (または公開する) か、保護する (または公開する) getter/setter メソッドを追加する必要があります。コンポジションを使用すると、これらのデータ メンバーがパブリックにならないように、パブリック ゲッター/セッター メソッドが必要になります。

Derived の楽しい方法では、次のようになります。

Base::fun(obj1, obj2) 

クラス Base の fun メソッドを呼び出します。

于 2012-11-19T21:48:52.547 に答える