派生類轉換為基類
我們先明確幾個概念,如果我理解的不對希望能有大神指出錯誤。
第一是,無論哪種繼承方式,子類擁有父類的所有成員變數和成員函式,只是訪問權的問題。舉個例子
[cpp] view plaincopyprint?
#include
using namespace std;
class a ;
class b:public a ;
int main()
#include
using namespace std;
class a
;class b:public a
;int main()
大家覺得最後輸出的結果是多少?
不是10.而是乙個隨機值
我的電腦是1629101750。
這說明什麼問題呢,b中有兩個i,乙個是父類的i,乙個是自己的i.
但是一般程式設計的人絕對不會這麼設計的,因為一般名字一樣只要父類有,子類繼承就可以了。
但是考試的人,就會這麼出題了,這就是為什麼大家寫了那麼多年程式,很多面試題還是沒有見過,還是不會,第一是我們基礎不牢固,第二是這些地方的實用性其實不是那麼大,可能永遠不會用到。 不過如果為了提高自己,主要是為了防止出差,很多細節還是需要研究研究,多寫寫**,來驗證自己的思想是不是正確。
那麼派生類轉換為基類怎麼理解呢?
按照c++ primer 中的說法有兩種形式,一種就是給基類賦值,一種是轉換為基類的引用或者指標。派生類物件自身並沒有變成基類物件。
這兩種方式有一些細微的區別,很多時候最好使用常引用最為函式的入參,為什麼呢?因為引用少了賦值的操作,效率上面會高一些。
可以檢視我寫的c++賦值的幾種方式, , 直接賦值應該是c語言中保留下來的,在c++中它的作用似乎就不大了,尤其對類和物件的。
大家看看下面的例子
[cpp]
#include
using namespace std;
class a
; void a::print()
a::a()
a::a(a& a)
a::a(int i)
int a::geti()
void a::set(a a)
class b: public a ;
void b::print()
b::b(int i)
int main()
#include
using namespace std;
class a
;void a::print()
a::a()
a::a(a& a)
a::a(int i)
int a::geti()
void a::set(a a)
class b: public a
;void b::print()
b::b(int i)
int main()
覺得輸出的結果是什麼呢?
我這裡的答案是:
102293028
201628665296
a print
a print
b print
為什麼呢?
子類會呼叫父類的預設建構函式,根據上面的內容,上題中子類中包含父類的所有元素和方法,但是父類中的預設建構函式沒有初始化自己的i,這樣i就是個隨機值。
子類無論是給父類賦值,還是轉換為父類的建構函式,父類中的i永遠都沒有被初始化,所以結果就是上面的內容。
後面的print函式,我們又回顧了一下虛函式的用法,虛函式只對引用和指標有作用。切記!
基類轉換為派生類
這個不可以,這個轉換關係不存在。
派生類到基類的轉換 和基類到派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...
C 基類和派生類
本講討論基類和派生類的基本概念。通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。在c 語言中,乙個派生類可以從乙個基類派生,也可...
C 基類和派生類
本講討論基類和派生類的基本概念。通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。在 c 語言中,乙個派生類可以從乙個基類派生,也...