1

最近、友達と一緒に次のような問題がありました。基本クラスがありました:

class A {
public:
    A() : foo(10) {}
    virtual int getFoo() const { return foo; }

protected:
    int foo;
};

友人が上記のクラスから派生したクラスを実装しました。

class B : public A {
public:
    void process() { foo = 666; }
protected:
    //int foo;
};

残念ながら、彼は子孫クラスにフィールドfooも追加しました(コメント行)。したがって、次のコード。

#include <iostream>

int main()
{
    A* aaa= NULL;
    if (1) {
        B* bbb = new B;
        bbb->process();
        aaa = bbb;
    }

    std::cout << aaa->getFoo() << std::endl;

    return 0;
}

印刷された10

これは完全に再設計され、将来そのようなことが起こらないので、それは問題ではありません。

私はちょうど疑問に思っていました、あなたは(明白なゲッター/セッター以外に、それらは実際にそこにあり、 fooはプライベートでした)、子孫クラスで同じ名前の変数を宣言することを許可しない(例えばコンパイル時エラーが発生します)。

TIA!

4

4 に答える 4

6

いいえ - 基本クラスの実装を気にする必要はないため、派生クラスのメンバーの名前付けに制約を受けるべきではありません。そして、保護されたデータは悪い考えです。

于 2010-07-28T15:59:37.137 に答える
3

すべての変数をプライベートにすることができます。変数が下位クラスで同じ名前を持っているかどうかは関係ありません。常に正しい変数にアクセスできます。カプセル化がはるかに優れているため、長期的にはコードの保守が容易になります。 .

PS : テスト ケースはそれほど複雑である必要はありません。

B b;
b.process();
b.getfoo();

10も返します

于 2010-07-28T16:09:13.143 に答える
1

C++ には、ユーザーをミスから保護するための多くの機能がありません。あなたが何を意図したかを知る方法が本当にないので、何が本当に間違いなのかわかりません。

于 2010-07-28T15:59:24.840 に答える
0

言語自体にはありませんが、一部のコンパイラは、特定の種類の警告をエラーとして報告するように構成できます。コンパイラのドキュメントを参照してください。

于 2010-07-28T16:30:34.333 に答える