C 學習筆記 類的型別轉換

2021-09-11 09:10:15 字數 968 閱讀 7263

c++ primer第五版p535頁有這樣一段話:在物件之間不存在型別轉換。派生類向向基類的自動型別轉換只對指標或引用型別有效,在派生類型別和基類型別之間不存在這種轉換。

#include#include#includeusing namespace std;

class animal

{public:

void eat()

{ cout<<"animal eat"《在這裡,呼叫fn實參傳入時,fish難道不是向animal進行了隱式轉換嗎?

現在大體知道以上程式通過編譯的原因是發生了切掉(sliced down)。

也就是說,當我們用乙個派生類物件為乙個基類物件初始化賦值時,只有該派生類中的基類部分會被拷貝、移動或賦值,它的派生類部分將被忽略掉。

其實,這和使用指標是相似的。看了半天,我理解的是這樣:利用指標進行從派生類到基類的型別轉換時,該指標仍是只能指向派生類物件中的基類部分,從狹義功能上來講,其與類型別轉換無差異。

比如#include#include#includeusing namespace std;

class animal

{public:

void eat()

{ cout<<"animal eat"//species->fish::test(); //非法

species->breathe(); //這種呼叫方式最終呼叫了fish中的虛函式

species->animal::breathe();

cout<那麼,使用指標的好處就是可以實現多型了。這才是根本區別。也就是說,若進行了類型別轉換,animal就是animal了,編譯器是不去記錄它原來是什麼型別的,也就不存在多型這個說法了。而使用指標時,並在基類中定義虛函式,那麼就會觸發動態繫結(dynamic binding),執行時就會根據物件的實際型別來呼叫相應的函式,實現了多型(polymorphism)

C 學習筆記(13) 類的型別轉換

c 的某些型別之間可以進行轉換,如int轉double,double轉int等等。而我們自定義的類 作為型別來看 也是可以進行轉換的。本篇筆記將總結c 類的型別轉換問題。一 型別轉換 可以將類定義成與基本型別或另乙個類相關,使得從一種型別轉換為另一種型別是有意義的。在這種情況下,程式設計師可以指示c...

C 學習筆記 07 型別轉換

型別轉換 賦值轉換 賦值轉換指的是將一種型別的值賦給另一種型別的變數,這時,值將會轉換為接收變數的型別,如語句 a b 如果a是long型,b是short型,則程式會將16位 short佔兩位元組 的b提公升為32位 long佔4位元組 並賦給a,直觀上講,型別的表達能力取決於該型別所佔的記憶體位數...

C 學習筆記13 型別轉換

const cast 運算子用於修改型別的 const volatile 屬性。除了 const 或 volatile 屬性之外,目標型別必須與源型別相同。這種型別的轉換主要是用來操作所傳物件的 const 屬性,可以加上 const 屬性,也可以去掉 const 屬性。class a void f...