賦值相容規則是指在需要基類物件的任何地方都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員,而且所有成員的訪問控制屬性也和基類完全相同。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。賦值相容規則中所指的替代包括以下的情況:
·派生類的物件可以賦值給基類物件。
·派生類的物件可以初始化基類的引用。
·派生類物件的位址可以賦給指向基類的指標。
在替代之後,派生類物件就可以作為基類的物件使用,但只能使用從基類繼承的成員。如果b
類為基類,d為
b類的公有派生類,則
d類中包含了基類
b中除構造、析構函式之外的所有成員,這時,根據賦值相容規則,
在基類b
的物件可以使用的任何地方,都可以用派生類的物件來替代。在如下程式中,b1為
b類的物件,d1為
d的物件。
class b
class d
:public b
b b1
,*pbl
;d d1
;這時:
①派生類物件可以賦值給基類物件,即用派生類物件中從基類繼承來的成員,逐個賦值給基類物件的成員:
b1=d1;②
派生類的物件也可以初始化基類物件的引用:
b &bb=d1;
③pb1=&d1;
由於賦值相容規則的引入,對於基類及其公有派生類的物件,我們可以使用相同的函式統一進行處理
(因為當函式的形參為基類的物件時,
實參可以是派生類的物件),
而沒有必要為每乙個類設計單獨的模組,從而大大提高了程式的效率。
這正是c++
的又一重要特色,即多型性,可以說,賦值相容規則是多型性的重要基礎之一。例:
賦值相容規則例項。
本例中,基類
b0以公有方式派生出
b1類,
b1類再作為基類以公有方式派生出
d1類,基類
b0中定義了成員函式
display()
,在派生類中對這個成員函式進行了覆蓋。程式**如下:
//** chap13_2.cpp
#include
.h>
class b0 //
基類b0宣告
//公有成員函式};
class b1
:publicb0 //
公有派生類
b1宣告 //
公有成員函式};
class d1
:public b1 //
公有派生類
b1宣告
//公有成員函式};
v0id fun(b0 *ptr) //
普通函式
v0id main() //
主函式這樣,通過
「物件名.成員名」或者
「物件指標
->
成員名」
的方式,就可以訪問到各派生類中新新增的同名成員。雖然根據賦值相容原則,可以將派生類物件的位址賦值給基類
b0的指標,但是通過這個基類型別的指標,卻只能訪問到從基類繼承的成員。
在程式中,定義了乙個形參為基類
b0型別指標的普通函式
fun,
根據賦值相容規則,可以將公有派生類物件的位址賦值給基類型別的指標,這樣,使用
fun函式就可以統一對這個類族中的物件進行操作。
程式執行過程中,分別把基類物件、
派生類b1
的物件和派生類
d1的物件賦值給基類型別指標
p,但是,通過指標
p,只能使用繼承下來的基類成員。也就是說,儘管指標指向派生類
d1的物件,
fun函式執行時通過這個指標只能訪問到
d1類從基類
b0繼承過來的成員函式
display
,而不是
d1類自己的同名成員函式。因此,主函式中三次呼叫函式
fun的結果是同樣的
——訪問了基類的公有成員函式。程式的執行結果為:
b0::display
b0::display
b0::display
通過這個例子,我們看到,根據賦值相容規則,我們可以在基類出現的場合使用派生類進行替代,但是替代之後派生類僅僅發揮出基類的作用。多型的設計方法可以保證在賦值相容的前提下,基類、派生類分別以不同的方式來響應相同的訊息。
賦值相容規則
宣告 本博文內容僅供交流學習使用,部分 來自網路 關於賦值相容規則相信不少和我一樣的初學者應該是一頭霧水吧,下面我就寫出個人的看法 開始之前我先要說乙個概念 指類 相信應該沒有那個書本上這樣說吧,這個概念在下面的第3點中會用到,下面舉例說明 int p 在這裡p是乙個指標,它指向乙個int型資料的4...
賦值相容規則
在一定條件下,不同型別的資料之間可以進行型別轉換,如可以將整型資料賦給雙精度型變數。在賦值之前,先把整型資料轉換成雙精度型資料,然後再把它賦給雙精度型變數。這種不同型別資料之間的自動轉換和賦值,稱為賦值相容。在基類和派生類物件之間也存有賦值相容關係,基類和派生類物件之間的賦值相容規則是指在需要基類物...
賦值相容規則
對於公有派生來說,可以將派生類的物件賦給基類的物件,反之是不可以的。賦值相容性規則可以總結為4點 1 不允許將基類的物件賦給派生類的物件。2 派生類的物件可以賦給基類的物件。3 可將派生類的物件的指標賦給基類的指標變數。4 派生類物件可以初始化基型別的引用。在3 4兩種情況下,使用基類的指標或引用時...