都說 c++ 是物件導向的語言,其中的物件導向主要包括三部分:繼承,封裝,多型。繼承和封裝我們之前就簡單介紹過,這裡主要對多型的使用方法做乙個簡單說明。
賦值相容說的是在使用基類物件的地方可以使用公有繼承類的物件來代替。賦值相容是一種預設的行為,不需要進行顯式轉換就能夠實現。
就比如在派生類拷貝建構函式的引數初始化列表中,我們會直接使用派生類物件作為基類拷貝建構函式的引數,而不會報錯,這就是賦值相容的表現。賦值相容主要表現在:
#include using namespace std;
class person
void display()
結果為:
the name is zhangsan
the *** is x
the num is 100
the name is zhangsan
the *** is x
the name is zhangsan
the *** is x
the name is zhangsan
the *** is x
上邊的程式可以看出,基類物件,引用和指標都可以使用派生類物件或者指標進行賦值,從而進行訪問。
其實也可以將基類指標強制轉換為派生類指標,進行訪問,但這種形式絕不是賦值相容:
int main()
結果為:
the name is zhangsan
the *** is x
the name is zhangsan
the *** is x
the num is 夽@
上邊的程式中,是將基類的指標強制轉換派生類的指標,從而呼叫派生類的物件。
c++ 中的多型主要說的是,在物件導向中,介面的多種不同的實現方式。
c++ 中的多型是介面多種不同的實現方式。而我們之前提到過的函式過載也是介面的多種不同的實現方式,因此也可以稱之為多型,只是函式過載是在編譯階段通過 name mangling 實現的,所以叫做靜多型。
而不在編譯階段而是在執行階段決定的多型就稱為動多型。動多型的形成條件為:
class classname
#include using namespace std;
class person
virtual void display()
結果為:
the name is zhsangsan
the *** is x
the num is 100
the job is *****
the name is zhsangsan
the *** is x
the num is 100
the job is *****
the name is zhsangsan
the *** is x
the num is 100
the job is *****
在虛函式的使用中,需要在派生類中 override 基類中的虛函式,表明該函式是從基類 override 得到的,override 的含義表明:
而有時為了可讀性,也為了防止編寫時出錯,可以通過在函式後新增 override 關鍵字表明這是 override 得到的。如上邊的例子中:
virtual void display() override
使用上邊的形式可以嚴格語法書寫。
對於一些抽象基類來說,我們並不需要在其中的虛函式中編寫什麼語句,因此可以將之寫成純虛函式。
class classname
如上例所示,可以將 student 中的 display 函式定義為純虛函式:
virtual void display() = 0;
只是此時不能夠呼叫 student 中的該函式了。
對於純虛函式而言:
含有虛函式的類,析構函式也應該宣告為虛函式。
#include using namespace std;
class person
virtual void display()
結果為:
the name is zhsangsan
the *** is x
the num is 100
student
person
****************
the name is zhsangsan
the *** is x
the num is 100
person
此時如果將析構函式宣告為 virtual:
virtual ~person();
class base2
};class derive1:public base1
;class derive2:public base2
;int main()
};class b:public a
;class c:public a
;class d
;int main()
void g()
void h()
private:
int data;
};int main()
virtual void g()
virtual void h()
private:
int data;
};int main()
virtual void g()
virtual void h()
private:
int data;
};typedef void (*func)(void);
int main()
virtual void g()
virtual void h()
private:
int data;
};class derive:public base
virtual void g1()
virtual void h1()
};typedef void (*func)(void);
int main()
virtual void g()
virtual void h()
private:
int data;
};class derive:public base
virtual void g1()
virtual void h1()
};typedef void (*func)(void);
int main()
{ derive b;
cout<<"sizeof(base) = "《結果為:
sizeof(base) = 8
sizeof(derive) = 8
sizeof(b) = 8
0x61fe94
0x402b54
0x402ad4
0x402b08
0x402b88
0x402bbc
0x3a434347
base::f1
base::g
base::h
base::g1
base::h1
在上邊的例子中,派生類 override 了父類的 f 函式,並又重新定義了幾個虛函式,因此對於派生類來說:
base *b = new derive();
b->f();
這段**的實際過程為: C 中的as和is的使用方法
as和is這兩個關鍵字在c 中還是比較常見的,比如說如果你想判斷乙個資料的型別是否是你指定的型別,那麼可以考慮使用is這個關鍵字,它會返回乙個bool值,如果是則為true,反之則是false。using system using system.collections.generic using s...
C 中實現多型的方法
c 實現多型的方法 在c 中,我們常說的多型有編譯時多型與執行時多型兩種。編譯時多型是指由編譯器在編譯的過程中,尋找與之合適的函式,類模板等來生成相關的 而執行是多型我們也常稱之為動態繫結 dynamic binding 這是在執行中由不同的物件來指定的。而這種動態繫結是c 提供的最有用的多型手段。...
C 中stringstream的使用方法和樣例
之前在leetcode中進行string和int的轉化時使用過istringstream,現在大致總結一下用法和測試用例。介紹 c 引入了ostringstream istringstream stringstream這三個類,要使用他們建立物件就必須包含sstream.h標頭檔案。istrings...