1

Base2 つのクラスがあるとしましょうDerivedgetXpublic でありsetX、保護された intを使用してユーザーとやり取りする と の2 つのメソッドがありxます。Baseコンストラクションはx1 に設定され、Derivedコンストラクションは x が 3 に設定されます。

class Base {
public:
    Base();
    int getX();
    void setX(int n);
protected:
    int x;
}

int Base::getX() {
    return x;
}

void Base::setX(int n) {
    x = n;
}

Base::Base() : x(1) {
}

class Derived : public Base {
public:
    Derived();
}

Derived::Derived() : x(3) {
}

このDerivedクラスは、Base のメソッドに完全にアクセスできます。偉大な。

何らかの理由で、クラスsetXのユーザーが利用できるようにしたくないとしましょう。Derived私が考えた方法はいくつかあります。

1) でプライベートsetXとして再宣言しDerivedます。これにより、シャドウイングによってユーザーがそのメソッドに完全にアクセスできなくなります。

2)xでプライベート const int として再宣言しDerivedます。ただし、これにより、setX と getX が Base::x で動作します。

3) Base::setX を仮想関数にし、何もしない Derived::setX 関数を作成します。

これを処理する最良の方法は何ですか?

4

4 に答える 4

1

仮想関数をオーバーライドしていないため、継承は疑わしいです。

Baseユーザーにインターフェースを使用してもらいたいですか、それともインターフェースを使用してもらいたいDerivedですか? あなたが言うならDerived、それはまた疑わしいです。

Derivedから作成しBase、より適切な名前を付けます。

class Composite {
private:
    Base base;
public:
    Composite() : base(3) {
    }
};
于 2013-11-06T21:13:10.100 に答える