0

私はクラスを持っています、それはそれらがすべて変更された1つのフィールドを使用し、それらの計算でこのフィールドを使用するいくつかのpublicメソッドを持っています。private

新しいメソッドがほとんどないこのクラスのサブクラスが必要です。新しいメソッドはこのフィールドを使用しません。基本クラスのこれらのメソッドは同じように動作することを期待していますが、プライベートフィールドを使用していることに少し混乱しています。

サブクラスでプライベートフィールドにアクセスできますか?サブクラスで同じタイプと名前のフィールドも宣言する必要がありますか?

4

5 に答える 5

3

プライベートメンバーデータは、派生クラスにはアクセスできません。このデータにアクセスする場合は、保護に変更してください。プライベートメンバーを変更するために使用される基本クラスのパブリックメンバー関数は、派生クラスで引き続き使用できますが、基本クラスのプライベートデータに直接アクセスすることはできません。基本クラスのすべてのパブリックフィールドと保護されたフィールドは、派生クラスで使用できます(パブリック継承を使用している場合)

于 2013-03-11T11:35:17.317 に答える
1

Private派生クラスがフィールドにアクセスすることはありません。プライベートフィールドにアクセスするメソッドをとして宣言した場合public、派生クラスはそれらを使用できます。

于 2013-03-11T11:36:29.770 に答える
1

ほとんどのポスターはあなたの質問を誤解しているようです。

はい、これらのパブリックメソッドを使用できます。これがプライベートメンバーの要点です。パブリック、保護、プライベートを問わず、同じクラスのメンバーなら誰でもアクセスできます。

于 2013-03-11T11:45:59.883 に答える
0

派生クラスのメンバーでは、プライベートフィールドにアクセスできません。ただし、基本クラスのメンバーは、その存在によって継承したものでありpublic、もちろん引き続きアクセスできます。基本メンバー関数は、継承を使用した場合は派生クラスを介して表示されますが、継承を使用しpublicた場合は派生クラスにのみ表示されます。キーワードを使用している場合はデフォルトですが、継承が使用されることはめったにありません。protectedprivateprotectedprivateclass

さらに明確にするために、フィールドにアクセスしたい場合は、アクセス権を持つ基本クラスでアクセサーを定義する必要がありprotectedます。これにより、プライベートフィールドへのアクセスを制御できます。

ただし、ここでポリモーフィズムが正しい解決策であるかどうかを自問する必要がありますか?派生クラスはis-aテストに合格しますか?基本クラスのデストラクタvirtualですか?

于 2013-03-11T11:46:33.930 に答える
0

ドライブクラスでパブリック関数(プライベートフィールドを使用)を使用できます。同じタイプのフィールドを宣言しないでください!! ただし、被駆動クラスの基本クラスからプライベートフィールドに直接アクセスすることはできませんでした。これには、基本クラスのパブリック関数(setter関数やgetter関数など)を使用します。

サンプル:

//***********************************
//Base Class
//***********************************
class Base
{
public:
    Base();
    ~Base();

    void increment();
    void decrement();

    void get();

private:
    int id_;
};

Base::Base()
    : id_(0)
{
}

Base::~Base()
{
}

void Base::increment()
{
    ++id_;
}

void Base::decrement()
{
    --id_;
}

int Base::get()
{
    return id_;
}

void Base::set(id)
{
    id_ = id;
}

//***********************************
// Drived Class
//***********************************
class Drived() : public Base
{
public:
    Drived();
    ~Drived();

    void plus(int a);
    void minus(int b);
};

Drived::Drived()
    : Base()
{
}

Drived::~Drived()
{
}

void Drived::plus(int a)
{
    int i = get();
    set(i + a);             // <- OK
}

void Drived::minus(int b)
{
    id_ -= b;               // <- Not allowd; id is private
}
于 2013-03-11T12:43:59.710 に答える