命名白白c 基類和派生類的轉換

2022-04-08 20:32:23 字數 1853 閱讀 1332

派生類轉換為基類

我們先明確幾個概念,如果我理解的不對希望能有大神指出錯誤。

第一是,無論哪種繼承方式,子類擁有父類的所有成員變數和成員函式,只是訪問權的問題。舉個例子

[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 語言中,乙個派生類可以從乙個基類派生,也...