1. 程式人生 > >【C++學習筆記】賦值相容規則

【C++學習筆記】賦值相容規則

定義及其理解:

所謂賦值相容規則,是指在需要基類物件的任何地方都可以使用公有派生類的物件來替代。這樣,公有派生類實際上就具備了基類的所有特性,凡基類能解決的問題,公有派生類也能解決。

這段話不太好理解,說白了就是:如果一個類是從一個基類公有繼承過來的,那麼這個派生類就可以替代基類(但基類不能替代派生類)。

再直白一點是:小靈通可以打電話,小靈通派生出功能更多的智慧機類,如果我們只要求打電話的智慧,那智慧機就能代替小靈通,但小靈通卻不能代替智慧機。

抽象看:
畢竟如果是公有繼承的話,其派生類的類內資料廣度肯定是大於基類,而public繼承的特性又讓在基類公有部分的資料許可權在繼承後能保持一致,所以公有派生類代替基類實際上是用一個有更高階的功能的類去代替低等級類。

可用操作:

(1)可以用派生類物件給基類物件賦值(只能單向)。
例:

Base b:
Derived d;
b=d;

這樣賦值的效果是,對於物件b中所有資料成員都將具有d中對應成員的值。

(2)可以用派生類物件來初始化基類的引用

Derived d;
Base &br = d;

(3)可以把派生類物件的地址賦值給指向基類的指標。

Derived d;
Base*bptr = &d;
注意

(i)宣告為指向基類物件的指標可以指向它的公有派生的物件,但不允許指向它的私有派生的物件。(指公不指私)
(ii)允許將一個宣告為指向基類的指標指向其公有派生類的物件,但是不能將一個宣告為指向派生類物件的指標指向其基類的一個物件。(基類可以指派生,派生不可指基類)
(iii)宣告為指向基類物件的指標,當其指向公有派生類物件時,**只有用它來直接訪問派生類中從基類繼承來的成員,**而不能直接訪問公有派生類定義的成員。
(iv)可以把指向派生類物件的指標賦值給指向基類物件的指標

Derived*dptr;
Base*bptr=dptr;

整理自浙大課程PPT,部分理解為原創。