0

基本クラス メソッド内で使用した場合、this ポインターはどのように動作しますか。

class Base{
public:
   int a;
   Base() : a(5) {}
   void func(){
       std::cout << " value is : " << this->a << std::endl;
   }
};

class Derived : public Base{
private:
   int a;
public:
   Derived() : a(1){}
   void func1(){
       std::cout << " value is : " << this->a << std::endl;
   }
};

int main(){
   Derived d;
   d.func();
   d.func1();
}

コードの出力は次のとおりです。

値: 5

値: 1

同じオブジェクトを使用して両方の関数を呼び出しているためです。このポインターの値は、基本クラスと派生クラスのメソッドで異なりますか?

4

3 に答える 3

2

this->aそのコンテキストでは と同等aであるため、ベース ポインターとは関係ありません。

メンバーaは静的に解決され、派生クラスは基本クラス メンバーを非表示にしますa

ポインター自体を確認するには、this直接印刷できます。

std::cout << this;

両方のオブジェクトで同じになります。

ここから得られる主なことは、Base::aDerived::aが異なるということです。で次のことを試してくださいDerived

void func1(){
    std::cout << "derived value is : " << a << std::endl;
    std::cout << "   base value is : " << Base::a << std::endl;
}
于 2012-09-25T11:27:57.377 に答える
0

thisポインターは常に、それが存在する現在のオブジェクトを指します。

func呼び出されると、基本クラスが使用され、基本クラス フィールドが出力されます。しかし、

func1呼び出されると、派生クラスが使用され、そのフィールドが出力されます。


この行にコメントを付けてみると、Derived() : a(1){}より明確になります。

于 2012-09-25T11:27:16.100 に答える
0

ベースthis->Base::aa. それ以外の場合は、常にアクセスしますDerived::a

于 2012-09-25T11:30:30.403 に答える