1

以下のサンプルコードを検討してください。

#include <iostream>

using namespace std;

class A
{
    private:
        static int a;
        int b;

    protected:

    public:

        A() : b(0) {}

        void modify()
        {
            a++;
            b++;
        }

        void display()
        {
            cout << a <<"\n";
            cout << b <<"\n";
        }

};

int A::a=0;

class B : public A {

    private:
        int b;

    public:
        B(): b(5)
        {
        }

};

int main()
{
    A ob1;
    B ob2;
    ob1.display();
    ob2.display();

    return 0;

}

上記のコードでは、class Aにはプライベートデータメンバーがあり、プライベートデータメンバーbclass Bありbます。この関数display()は、データメンバーを表示するために使用されます。を使用してdisplay()を呼び出すob1.display()と、display()はクラスAのプライベートデータメンバーにアクセスしますb。私はそれを理解しています。しかし、を使用してdisplayを呼び出すと、 display()はどちらにアクセスしますかob2.displaybそれはbクラスAのものbですか、それともクラスBのものですか?アクセスする理由を説明してくださいclass A's bまたはclass B's b

4

3 に答える 3

3

アクセスしますA::bdisplayクラスでのメソッドの実装には、それを使用することAは言うまでもなく、存在についての手がかりはまったくありませんB::b。すべての意図と目的のために、はとB::bは別ですA::b。それ自体の範囲内でのみB、名前の競合により、b参照、B::b非表示になりA::bます。メンバー変数を。にすることはできませんvirtual

于 2012-01-05T02:50:44.403 に答える
2

ob2.display()派生クラスメンバーにアクセスします。
メンバー関数呼び出しは常にで評価されthisます。incaseはBaseクラスthis->display()thisオブジェクトを指しているため、関数b内への参照はすべてBaseクラスのものとして評価されます。 display()this->bb

これはdisplay()、Baseクラスが、他のクラスがそれから派生しているかどうかを認識していないためです。基本クラスは常にDerivedクラスから独立しています。問題を解決するために従う通常のパターンは、Derivedクラスにメソッドを提供し、次にBaseクラスdisplay()のメソッドを呼び出すことです。dsiplay()

void B::display()
{
    //cout << a <<"\n";
    cout << b <<"\n";
    A::display();    
}
于 2012-01-05T02:53:11.110 に答える
0

クラスAです。A::display()B人のプライベートメンバーにはアクセスできません。

于 2012-01-05T02:51:38.537 に答える