成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++多態性基本概念講述

開發 后端
C++多態性主要是通過虛函數來實現的。我們只有在重寫了虛函數之后才能被看做是C++多態性。在這里將會對此做一個詳細介紹。

C++編程語言是一款應用廣泛,支持多種程序設計的計算機編程語言。我們今天就會為大家詳細介紹其中C++多態性的一些基本知識,以方便大家在學習過程中對此能夠有一個充分的掌握。#t#

前幾天筆試的時候碰到考C++多態性的題目,因為不是自己的專業不是純做軟件開發,C++學習不是很好,做得有點混亂。回來以后立刻查了相關資料,大概明白了一點,可能以后解題的時候不會亂了。

先摘下一些網上的書上的基本概念。

多態性可以簡單地概括為“一個接口,多種方法”,程序在運行時才決定調用的函數,它是面向對象編程領域的核心概念。多態(polymorphisn),字面意思多種形狀。

C++多態性是通過虛函數來實現的,虛函數允許子類重新定義成員函數,而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。(這里我覺得要補充,重寫的話可以有兩種,直接重寫成員函數和重寫虛函數,只有重寫了虛函數的才能算作是體現了C++多態性)而重載則是允許有多個同名的函數,而這些函數的參數列表不同,允許參數個數不同,參數類型不同,或者兩者都不同。編譯器會根據這些函數的不同列表,將同名的函數的名稱做修飾,從而生成一些不同名稱的預處理函數,來實現同名函數調用時的重載問題。但這并沒有體現多態性。

多態與非多態的實質區別就是函數地址是早綁定還是晚綁定。如果函數的調用,在編譯器編譯期間就可以確定函數的調用地址,并生產代碼,是靜態的,就是說地址是早綁定的。而如果函數調用的地址不能在編譯器期間確定,需要在運行時才確定,這就屬于晚綁定。

那么多態的作用是什么呢,封裝可以使得代碼模塊化,繼承可以擴展已存在的代碼,他們的目的都是為了代碼重用。而多態的目的則是為了接口重用。也就是說,不論傳遞過來的究竟是那個類的對象,函數都能夠通過同一個接口調用到適應各自對象的實現方法。

最常見的用法就是聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而實現不同的方法。如果沒有使用虛函數的話,即沒有利用C++多態性,則利用基類指針調用相應的函數的時候,將總被限制在基類函數本身,而無法調用到子類中被重寫過的函數。因為沒有多態性,函數調用的地址將是一定的,而固定的地址將始終調用到同一個函數,這就無法實現一個接口,多種方法的目的了。

筆試的題目

  1. #include <stdio.h> 
  2. class A  
  3. {  
  4. public:  
  5. void foo()  
  6. {  
  7. printf("1");  
  8. }  
  9. virtual void fuu()  
  10. {  
  11. printf("2");  
  12. }  
  13. };  
  14. class B:public A  
  15. {  
  16. public:  
  17. void foo()  
  18. {  
  19. printf("3");  
  20. }  
  21. void fuu()  
  22. {  
  23. printf("4");  
  24. }  
  25. };  
  26. int main()  
  27. {  
  28. A a;  
  29. B b;  
  30. A *p = &a;  
  31. p->foo();  
  32. p->fuu();  
  33. p = &b;  
  34. p->foo();  
  35. p->fuu();  
  36. return 0;  

第一個p->foo()和p->fuu()都很好理解,本身是基類指針,指向的又是基類對象,調用的都是基類本身的函數,因此輸出結果就是1、2。

第二個p->foo()和p->fuu()則是基類指針指向子類對象,正式體現多態的用法,p->foo()由于指針是個基類指針,指向是一個固定偏移量的函數,因此此時指向的就只能是基類的foo()函數的代碼了,因此輸出的結果還是1。而p->fuu()指針是基類指針,指向的fuu是一個虛函數,由于每個虛函數都有一個虛函數列表,此時p調用fuu()并不是直接調用函數,而是通過虛函數列表找到相應的函數的地址,因此根據指向的對象不同,函數地址也將不同,這里將找到對應的子類的fuu()函數的地址,因此輸出的結果也會是子類的結果4.

筆試的題目中還有一個另類測試方法。即

 

  1. B *ptr = (B *)&a;  
  2. ptr->foo();  
  3. ptr->fuu(); 

 

問這兩調用的輸出結果。這是一個用子類的指針去指向一個強制轉換為子類地址的基類對象。結果,這兩句調用的輸出結果是3,2。

并不是很理解這種用法,從原理上來解釋,由于B是子類指針,雖然被賦予了基類對象地址,但是ptr->foo()在調用的時候,由于地址偏移量固定,偏移量是子類對象的偏移量,于是即使在指向了一個基類對象的情況下,還是調用到了子類的函數,雖然可能從始到終都沒有子類對象的實例化出現。

而ptr->fuu()的調用,可能還是因為C++多態性的原因,由于指向的是一個基類對象,通過虛函數列表的引用,找到了基類中foo()函數的地址,因此調用了基類的函數。由此可見多態性的強大,可以適應各種變化,不論指針是基類的還是子類的,都能找到正確的實現方法。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-02-05 17:34:37

C++函數模板

2009-08-28 16:48:50

C#多態性

2009-09-01 15:08:18

C#多態性

2010-01-28 16:16:32

C++多態性

2010-02-03 13:22:07

C++時間

2010-02-05 12:57:20

C++ kdevelo

2010-02-02 10:33:22

C++引用

2010-02-01 17:24:41

C++循環語句

2010-02-03 14:36:47

C++仿函數

2010-02-02 13:41:01

C++類繼承

2010-02-03 11:11:18

C++類型轉換

2010-02-02 15:30:05

C++ include

2010-01-15 13:30:50

VB.NET Prog

2010-02-06 09:53:26

C++ void

2009-09-01 14:51:19

C#多態性

2010-02-06 14:04:58

C++內存使用機制

2010-02-04 13:56:24

C++類模板特化

2010-02-04 10:08:00

C++靜態成員函數

2010-02-04 17:39:48

C++字符串類型

2010-02-06 15:58:10

C++集合初始化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一色桃子av一区二区 | 九七午夜剧场福利写真 | 成人亚洲精品久久久久软件 | 国产精品影视在线观看 | 91免费电影 | 欧美午夜视频 | 天天射网站 | 黄色免费在线网址 | 777毛片| 美女啪啪国产 | 国产精品伦理一区 | 国产成人午夜电影网 | 亚洲视频在线看 | 午夜天堂 | 超碰伊人久久 | 视频一区二区在线观看 | 精品视频在线观看 | 欧洲免费毛片 | 亚洲人人舔人人 | 黄色一级大片视频 | 亚洲精品自拍 | 欧美一级艳情片免费观看 | 精品久久久久久亚洲精品 | 亚洲一级av毛片 | 久久91av| 毛片在线免费 | 国产免费一区二区三区免费视频 | 91av大全 | a级片网站 | 久久不卡区 | 午夜电影网 | 成人国产精品色哟哟 | 欧美一区二区三区精品 | 九九色综合 | 日韩精品一区二区三区中文字幕 | 免费一级大片 | 在线播放国产一区二区三区 | 久久天天综合 | 在线视频中文字幕 | 久久中文字幕一区 | 日本成人午夜影院 |