c最簡單的多型例子,c 最簡單的多型例子,class A classb

2022-02-14 19:45:30 字數 3033 閱讀 8659

1樓:巨潤利

c++中的多型(雖然多型不是c++所特有的,但是c++中的多型確實是很特殊的)分為靜多型和動多型(也就是靜態繫結和動態繫結兩種現象),靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型;發生在執行期的則是動態繫結,也就是動多型。

靜多型可以通過模板和函式過載來實現(之所說c++中的多型主要還是因為模板這個東西),下面舉兩個例子:

1)函式模板

template

t max(const t& lsh, const t& rhs)

返回兩個任意型別物件的最大值(物件),前提是該型別能夠使用》運算子進行比較,並且返回值是bool型別。

使用:int a = 3; int b = 4;

cout << max(a, b) << endl;

float c = 2.4; float d = 1.2;

cout << max(c, d) << endl;

輸出結果為:

42.4

這種繫結發生在編譯期,這是由於模板的例項化是發生在編譯期的,即在編譯時編譯器發現你呼叫max(a, b)時就自動生成一個函式

int max(const int& lsh, const int& rhs)

即將所有的t替換成int;

當你呼叫max(c, d)時就自動生成一個函式

float max(const float& lsh, const float& rhs)

之所以說開始的函式定義是函式模板,就是因為他就像個模子似的,你可以用鋁作為原料也可以用石膏或者銅。

2)函式過載:

int max (int a, int b)

int max (int a, int b, int c)

兩個函式名稱一樣,引數型別或個數不完全相同,返回值一樣(這個不重要)。

使用:int a = 3, b = 4, c = 5;

cout << max(a, b) << endl;

cout << max(a, b, c) << endl;

輸出結果為:45

確定函式的過程也發生在編譯器,當你使用max(a, b),編譯器發現只有兩個引數,那麼就呼叫只有兩個引數的函式版本,當使用max(a, b, c)時,編譯器則使用有3個引數的版本。

通過上面的兩個例子,你還可以使用更為方便的模板函式過載:

template

t max(const t& lsh, const t& rhs)

template

t max(const t& a, const t& b, const t& c)

使用float a = 3.6, b = 1.2, c = 7.8;

cout << max(a, b, c) << endl;

輸出:7.8

通過引數個數和型別,編譯器自動生成和呼叫對應得函式版本!

動多型則是通過繼承、虛擬函式(virtual)、指標來實現。

class a

}class b : public a

}使用:

a a* = b();

a->func();

輸出:b::func()

編譯期是不呼叫任何函式的,編譯器編譯到a->func()時只是檢查有沒有語法問題,經過檢查沒有。編譯器並不知道呼叫的是a版本的func()還是b版本的func(),由於a是一個指向b物件的指標,所以a只知道它指向的是一個a型別(或者能轉換成a型別)的物件。通常整合體系就說明了(由於是公有繼承)b是一種a。

在執行期,a要呼叫a所指向物件的func()函式,就對它指向的物件下達呼叫func()的命令,結果a所指向的是一個b物件,這個物件就呼叫了自己版本(b版)的func()函式,所以輸出時b::func()

總結:在編譯期決定你應該呼叫哪個函式的行為是靜態繫結(static-binding),這種現象就是靜多型。

在執行期決定應該呼叫哪中型別物件的函式的行為是動態繫結(dynamic-binding),這種現象就是動多型

請問在c++ 中類定義 class a : b { }; 然後 class b: a {} 的用法是正確的嗎?是不是要提前定義一個類。

2樓:

class a : b ; 這樣是不對的,要表明你是怎麼繼承的,是私有繼承,還是共有繼承,要這樣寫

class a : public b ;並且b類是要存在的

3樓:匿名使用者

執行到class a : public b,會由於派生類找不到基類b而報錯

4樓:

果斷錯的!

class 《派生類名》:《繼承方式》《基類名》

;應該這樣!!!

c++多型性的一道經典例題

5樓:匿名使用者

這個例子一般在很多教材上都可以找的。

要求大概不是讓你執行後生成某一個圖形,模擬一下而已~

多型 有編譯時的多型(靜態聯編,即編譯時確定操作物件) 和 執行時的多型(動態聯編,即執行時確定操作物件),而虛擬函式是實現動態聯編的基礎。

繼承是實現**重用 而 多型 是實現 介面重用,介面是最有價值的資源,設計介面需要耗費更昂貴的人力和時間。

舉個簡單的例子:

飛機是一個總成,它可以派生出 客機,*** 。

所以可以設計 一個基類 「飛機」 然後公有派生出 「客機」 「***」

飛機都可以起飛,所以在基類「飛機」中設計一個 虛擬函式 fly(),顯然「客機」和「***」有不同的起飛方式,所以,在「客機」和「***」中

繼承來的fly()函式應當是不同的,即相同的函式有不同的實現。

然後假設用 「飛機」生成一個指標型的物件 *p,「客機」「***」也分別生成各自的物件, 把「客機」的物件賦給*plan,則用plan呼叫fly(),則按照客機的起飛方式起飛,把「***」的物件賦給*plan,用plan呼叫fly()則按照***起飛的方式 起飛。

所以多型是允許你將父物件設定成為一個或更多的它的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。

c簡單的題,c 簡單的題

5.b c 語言中函式既可以巢狀定義,也可以遞迴呼叫 c 語言中函式不可以巢狀定義 c 函式必須有返回值 函式可以沒有返回值,例如函式返回值型別宣告為void時,該函式沒有返回值 d c 程式中有呼叫關係的所有函式必須放在同一源程式檔案中 這個不是必須的,只要包含了相關函式宣告所在的標頭檔案,就可以...

c語言裡常量的定義舉幾個簡單的例子

嚴格來說,不存在常量這個東西的,只能說某個變數擁有隻讀許可權。我能想到兩種方式,巨集定義 利用 define來定義常量 比如很常見的 define pi 3.1415f這樣就定義了 的值。const 變數 利用const修飾一個變數,可以讓這個變數擁有隻讀屬性。const float pi 3.14...

簡單的c 問題,一個簡單的c 問題

使用io庫裡面的檔案輸入和輸出標頭檔案定義的三種支援檔案io的型別可以實現你說的要求 include include include include using namespace std int ftov string filename,vector svec int main 在工程的資料夾裡面...