賦值相容規則

2021-06-13 21:30:48 字數 2718 閱讀 6759

宣告:本博文內容僅供交流學習使用,部分**來自網路

關於賦值相容規則相信不少和我一樣的初學者應該是一頭霧水吧,下面我就寫出個人的看法

開始之前我先要說乙個概念「指類」,相信應該沒有那個書本上這樣說吧,這個概念在下面的第3點中會用到,下面舉例說明

int *p;在這裡p是乙個指標,它指向乙個int型資料的4位元組空間,我自己看來乙個指標宣告的時候已經說明了它指向的物件是什麼多大空間(個人觀點請大家指正),切記

ok言歸正傳,賦值相容規則的本質是——在需要基類物件的任何地方都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員,而且所有成員的訪問控制屬性也和基類完全相同。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。

賦值相容規則中所指的替代包括以下的情況: 

1·派生類的物件可以賦值給基類物件。如

a a1; //定義基類a物件a1

b b1; //定義類a的公用派生類b的物件b1

a1=b1; //用派生類b物件b1對基類物件a1賦值

在賦值時捨棄派生類自己的成員,只進行資料成員的賦值。

實際上,所謂賦值只是對資料成員賦值,對成員函式不存在賦值問題,記憶體中資料成員和成員函式是分開的。

請注意: 賦值後不能企圖通過物件a1去訪問派生類物件b1的成員,因為b1的成員與a1的成員是不同的。

假設age是派生類b中增加的公用資料成員,分析下面的用法:

a1.age=23;//錯誤,a1中不包含派生類中增加的成員

b1.age=21; //正確,b1中包含派生類中增加的成員

只能用子類物件對其基類物件賦值,而不能用基類物件對其子類物件賦值,理由是顯然的,兩種物件的大小是不同的,因為基類物件不包含派生類的成員,

無法對派生類的成員賦值。同理,同一基類的不同派生類物件之間也不能賦值。 

2·派生類的物件可以初始化基類的引用。如

已定義了基類a物件a1,可以定義a1的引用變數:

a a1; //定義基類a物件a1

b b1; //定義公用派生類b物件b1

a &r=a1; //定義基類a物件的引用變數r(a的別名是r),並用a1對其初始化

這時,r和a1共享同一段儲存單元。也可以用派生類物件初始化引用變數r,將上面最後一行改為

a& r=b1;//定義基類a物件的引用變數r,並用派生類b物件b1//對其初始化

注意: 此時r並不是b1的別名,也不與b1共享同一段儲存單元。它只是b1中基類部分的別名(個人認為

這裡的r定義為a類的引用,所以它的有效範圍就只有a類那麼大),r與b1中基類部分共享同一段儲存單元,r與b1具有相同的起始位址。 

如果函式的引數是基類物件或基類物件的引用,相應的實參可以用子類物件。如有一函式

fun: void fun(a& r)//形參是類a的物件的引用變數

//輸出該引用變數的資料成員num

函式的形參是類a的物件的引用變數,本來實參應該為a類的物件。由於子類物件與派生類物件賦值相容,派生類物件能自動轉換型別,

在呼叫fun函式時可以用派生類b的物件b1作實參: fun(b1); 輸出類b的物件b1的基類資料成員num的值。與前相同,在fun函式中只能輸

出派生類中基類成員的值。

3·派生類物件的位址可以賦給指向基類的指標。也就是說,指向基類物件的指標變數也可以指向派生類物件。

例定義乙個基類student(學生),再定義student類的公用派生類graduate(研究生), 用指向基類物件的指標輸出資料。本例主要是說明

用指向基類物件的指標指向派生類物件,為了減少程式長度,在每個類中只設很少成員。學生類只設num(學號),name(名字)和score(成績)

3個資料成員,graduate類只增加乙個資料成員pay(工資)。

程式如下(以下**來自網路):

#include #include using namespace std;

class student//宣告student類

;student::student(int n, string nam,float s) //定義建構函式

void student::display( )//定義輸出函式

很多讀者會認為: 在派生類中有兩個同名的display成員函式,根據同名覆蓋的規則,被呼叫的應當是派生類graduate物件的display函式,

在執行graduate::display函式過程中呼叫student::display函式,輸出num,name,score,然後再輸出pay的值。

事實上這種推論是錯誤的,先看看程式的輸出結果:

num:1001

name:li

score:87.5

num:2001

name:wang

score:98.5

並沒有輸出pay的值。

問題在於pt是指向student類物件的指標變數,它的指類是student類,即使讓它指向了grad1,但實際上pt指向的是grad1中從基類繼承的

部分(它指向的空間只能是基類中資料成員那麼大的空間)。通過指向基類物件的指標,只能訪問派生類中的基類成員,而不能訪問派生

類增加的成員。所以pt->display()呼叫的不是派生類graduate物件所增加的display函式,而是基類的display函式,所以只輸出研究生grad1

的num,name,score3個資料。

賦值相容規則

賦值相容規則是指在需要基類物件的任何地方都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式 析構函式之外的所有成員,而且所有成員的訪問控制屬性也和基類完全相同。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。賦值相容規則中所指的替代包...

賦值相容規則

在一定條件下,不同型別的資料之間可以進行型別轉換,如可以將整型資料賦給雙精度型變數。在賦值之前,先把整型資料轉換成雙精度型資料,然後再把它賦給雙精度型變數。這種不同型別資料之間的自動轉換和賦值,稱為賦值相容。在基類和派生類物件之間也存有賦值相容關係,基類和派生類物件之間的賦值相容規則是指在需要基類物...

賦值相容規則

對於公有派生來說,可以將派生類的物件賦給基類的物件,反之是不可以的。賦值相容性規則可以總結為4點 1 不允許將基類的物件賦給派生類的物件。2 派生類的物件可以賦給基類的物件。3 可將派生類的物件的指標賦給基類的指標變數。4 派生類物件可以初始化基型別的引用。在3 4兩種情況下,使用基類的指標或引用時...