問題:
- 在下面的代碼中,“this”指標指向基類和派生類中的不同事物,即使它在技術上包含相同的地址。這是為什么。
- 當“this”指標與繼承一起使用時會發生什么。(任何幫助將不勝感激。謝謝。)
#include <iostream>
using namespace std;
// this pointer and inheritance.
class base {
public:
int x;
base() {
x = 10;
}
void func() {
cout<< this->x << endl; // 10
cout<< this << endl;
}
};
class derived : public base {
public:
int x;
derived() {
x = 20;
}
void func() {
cout<< this->x << endl; // 20
cout<< this << endl;
base::func();
}
};
int main () {
derived d;
d.func();
cout<< "execution complete.\n";
return 0;
}
output:
20
0x61ff18
10
0x61ff18
execution complete.
uj5u.com熱心網友回復:
- 在下面的代碼中,“this”指標指向基類和派生類中的不同事物,即使它在技術上包含相同的地址。這是為什么。
類包含子物件。它們可以是基本子物件或非靜態資料成員。第一個子物件可以共享封裝完整物件的記憶體地址:
|derived | < complete object
|base|x | < sub objects of derived
|x | < sub objects of base sub object
^
|
same address
- 當“this”指標與繼承一起使用時會發生什么。
如果呼叫類的非靜態成員函式,this則指向該函式中的實體引數。
如果呼叫派生物件的基類的非虛擬非靜態成員函式,this將指向該函式內的基類子物件。
如果您使用非限定查找呼叫類的虛擬非靜態成員函式,它將呼叫該函式的最派生覆寫,并且this在該函式內將指向派生該函式的物件。
uj5u.com熱心網友回復:
你的類derived包含兩個整數。他們有這樣的名字:
this->base::x
和
this->derived::x
您似乎發現的是,您可以簡單地鍵入this->x來參考這些整數之一。
編譯器將x根據背景關系決定您指的是哪個。在base課堂上,你一定是說this->base::x. 在派生類中,您必須表示this->derived::x并且需要顯式撰寫this->base::x以告訴編譯器您指的是該整數。
這就是根據背景關系可以改變含義的方式。this->x
uj5u.com熱心網友回復:
derived你的程式中的類有一個名為的成員函式func,它隱藏了繼承的同名成員函式base。同樣,derived該類還有一個名為的資料成員x,它將繼承的同名資料成員隱藏base在.
現在,當你寫道:
d.func(); //this calls the derived class member function `func` implicitly passing the address of `d` to the implicit `this` parameter
在上面的呼叫中,您正在呼叫derived類的成員函式func,同時隱式地將地址傳遞d給隱式this引數。thisinsidefunc的型別derived是derived*。
func現在,derived運算式的成員函式內部使用派生類this->x的資料成員(而不是繼承的成員),因為如上所述,它從基類中隱藏了繼承的成員。這樣我們就得到了輸出。xx 20
接下來,cout<< this << endl;只需列印this.
接下來,遇到呼叫運算式。 base::func()還要注意,base::func()相當于寫this->base::func()。這具有呼叫func由于派生類具有同名函式而被隱藏的繼承成員函式命名的效果。還要注意,在此呼叫中,相同的地址被傳遞給基類的隱式this引數。func這次不同的是,thisinsidebase的成員函式func是 type base*。
現在,在 的成員函式內部func,運算式中的參考基類的資料成員,因此列印出值。這樣我們就得到了輸出。basexthis->xx10 10
最后,我們有cout<< this << endl;insidebase的成員函式func,它只列印this.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477236.html
