5

メンバー変数 (できれば ) を持つ基本クラスがありprivate、実装に基づく値で初期化するように派生クラスを強制する必要があります。純粋仮想関数によく似ています。

明確にするために、Base でメンバーを宣言し、派生クラスにそれを初期化させ、そうしないとコンパイラ エラーが発生するようにしたいと考えています。次のコードでは、 のデフォルト コンストラクターを と宣言しBaseましprotectedた。次に、 のデフォルト コンストラクターを と宣言しDerivedましprivateた。

class Base {
private:
    int _size;

protected:
    Base(){}
    /* pure virtual methods */

public:
    Base(int size) : _size(size){} // must enforce derived to call this.
    virtual ~Base(){}

    /* more pure virtual methods */
};

class Derived : public Base {
private:
    Derived() {}
public:
    Derived(int size) : Base(size) {
        //Base::Base(size);
    }
};

int main()
{
    Derived* d1 = new Derived();    // throws an error as needed: 
                                    // "Cannot access private member declared in class 'Derived'"

    Derived* d2 = new Derived;      // throws an error as needed: 
                                    // "Cannot access private member declared in class 'Derived'"

    Derived* d3 = new Derived(5);   // works as needed

    return 0;
}

上記のコードの問題は、 の別の定義がDerived既定のコンストラクターを非表示にしない場合です。私はまだ初期化されていないBase::_size.

で宣言されたいくつかのメソッドに対して独自の動作を実装するには、派生クラスがまだ必要であるため、継承以外にこれを行う別の方法があるかどうかはわかりませんBase

任意のポインタをいただければ幸いです。

4

2 に答える 2