1. 程式人生 > >C++的動態多型和靜態多型

C++的動態多型和靜態多型

這些行為是可以在編譯期決定的 可以考慮使用模板多型用這一點來考察標準模板庫 STL STL 提供的容器類和針對容器類的演算法都屬於這個範疇 雖然這些容器可以存放不同型別的物件 但是這些物件的型別和大小是編譯前決定的不會在執行期改變

2.4 policy-based 的程式設計
採用模板的結構實現點的結構 可以應用於二維和三維

的情況 我們的演算法只要在使用的時候配置不同的引數就可以了 為了具有更大的通用性 可以把維數推廣到 N

template<int N> class Coord{ double coords_[N];
public:
double get(int index) const{//返回在 index 緯度上的值}void set(int index, double value){//設定在 index 緯度上的值} };
template<int N> double DistanceN(const Coord<N> & pt1,constCoord<N> & pt2)
{//求得距離}


N 的大小由使用這個泛型演算法或構件的使用者在編譯期選

定 使用者可能還有其他的選擇 例如在不同的執行緒的環境下面 資料是否加鎖 但是除了這種加鎖的操作 其他的程式碼沒有改變 應該複用這些程式碼 並且把加鎖的選擇交到使用者的手中 使用者的不同選擇體現為使用者的一種策略 程式設計者應該充分的考慮這些策略 體現在程式碼當中

這種基於策略考慮的程式設計稱為 policy-based 的程式設計 這樣的設計方法在 Andri Alexandrescu 的著作中有過充分的論述[4] 並且展示了這種方法的巨大威力 policy-based程式設計利用多重繼承和模板機制 把各種要考慮的策略設計成為高度可組裝化的基本單位 使用者可以靈活地選擇 配置自己的應用程式 一般來說 這樣的策略應該是正交的[4]

policy-based 的設計方法在很多的情況下首先考慮複雜的情況 然後把簡單的情況看成是複雜情況的一種退化 考慮不同的執行緒環境 多執行緒環境下的加鎖是確實的行為 而單執行緒則是空函式 這種技術在微軟的 ATL 中有大量的應用

如果我們的程式碼需要表現出某種策略的選擇 這種策略依賴於客戶端程式碼的編譯前配置 而如果不考慮這些策略程式碼表現出很大的共同性 在這種情況下可以考慮使用模板多型

2.5 效率
相對於其他的語言 例如 Java 效率是 C++的一個重要

的優勢 模板多型是靜態的多型 相對於虛擬函式的多型 當然更有效率 這一點在某些對效率要求很高的程式 例如數學庫 中 顯得尤為重要 有時候用模板來實現一些數學運算 也是為了減少讀寫次數 避免臨時變數的產生 因為有的時候臨時變數的產生是一個嚴重的效能障礙 尤其是對於高維的向量和矩陣 在文獻[3]中 針對這一專題作了專門的論述 並且提出了表示式模板(Expression

Template)的概念 使得浮點陣列向量的運算既能保持優雅的結構 又能夠獲得高效率[3]

總而言之 當我們的程式對效率要求很高的情況下 可以考慮使用模板多型

3 結論
C++中 C++同時支援這兩種程式設計範型的程式碼程式 它們的本質不同點在於 模板是靜態的技術 在編譯期決定 虛擬函式更側重於執行期 適合描述動態的行為 虛擬函式通過間接層增加編譯器防火牆 模板取消間接層增加效率 模板有自己的使用範圍 一般來說 在下面的情況下 更適合於使用模板 而不是虛擬函式 (1)當該文的程式使用了物件本身的集合 而不是物件指標的集合 而這些物件的行為表現出共同性的時候可考慮使用模板多型 (2)如果該文的演算法或者構件表現出共同的行為 而這些行為是可以在編譯期決定 可以考慮使用模板多型 (3)如果該文的程式碼需要表現出某種策略的選擇這種策略依賴於客戶端程式碼的編譯前配置 而如果不考慮這些策略 程式碼表現出很大的共同性 在這種情況下可以考慮模板多型和虛擬函式多型是可以共存的 因為 

使用模板多型 (4)該文的程式對效率要求很高的情況下 可考慮使用模板多型 

相關推薦

C++的動態靜態

這些行為是可以在編譯期決定的 可以考慮使用模板多型用這一點來考察標準模板庫 STL STL 提供的容器類和針對容器類的演算法都屬於這個範疇 雖然這些容器可以存放不同型別的物件 但是這些物件的型別和大小是編譯前決定的不會在執行期改變 2.4 policy-based 的程式設計採用模板的結構實現點的結構 可

C++中的動態靜態

轉自http://www.cnblogs.com/lizhenghn/p/3667681.html 今天的C++已經是個多重泛型程式語言(multiparadigm programming lauguage),一個同時支援過程形式(procedural)、面向

深入Java虛擬機器:性實現機制--動態單分派靜態分派

分派發生在編譯期和執行期,編譯期的分派為靜態分派,執行期的為動態分派。 編譯期是根據物件宣告的型別來選擇方法,執行期是根據物件實際型別來選擇方法。 術語: 宗量(JVM虛擬機器) , 什麼是宗量, 方法呼叫者和方法引數被稱為宗量.(後面理解分派需要) 靜態型別:

java中實現的機制是什麼,動態靜態的區別?(java基礎一)

多型總結: 指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,儘管是過載該方法。若子類重寫了父類中的某些方法,在呼叫該些方法的時候,必定是使用子類中定義的這些方法(動態連線、動態呼叫)。 一、多型的

Go 生成C動態庫.so靜態庫.a

Go 生成C動態庫.so和靜態庫.a 原始碼 package main import "C" import "fmt" //export hello func hello(){ fmt.Println("hello world") } //export add func

C++ 動態繫結靜態繫結

virtual 函式實現多型性 #include <iostream> using namespace std; struct TreeNode { TreeNode *left; TreeNode *rignt; }; class Gener

[C++]動態繫結靜態繫結

C++的動態繫結和靜態繫結 物件的靜態型別: 物件在宣告時採用的型別。是在編譯期確定的。 物件的動態型別: 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更改。

C++ 動態連結庫靜態連結庫

typedef int (*DllFunc)(int, int); int _tmain(int argc, _TCHAR* argv[]) { DllFunc dllFunc; HINSTANCE hInstLib = LoadLibrary(L"DllTest.dll"); if (hInstLi

c++動態聯編靜態聯編

將一個呼叫函式者聯結上正確的被呼叫函式,這過程叫做函式聯編。c++中的聯編分兩種,分為靜態聯編和動態聯編。 為加virtual時是靜態聯編;加入virtual是動態聯編。只有在使用指標或者引用時,才能實現在執行時的動態聯編。 #include<io

Java動態繫結靜態繫結-

一、問題 Java方法呼叫過程中,Jvm是如何知道呼叫的是哪個類的方法?Jvm又是如何處理?   二、概念 a、當子類和父類(介面和實現類)存在同一個方法時,子類重寫父類(介面)方法時,程式在執行時呼叫的方法時,是呼叫父類(介面)的方法呢?還是呼叫子類的方法呢?我

C語言用巨集實現靜態

綜述 多型性是面向物件程式設計的一個重要特徵。 在C++語言中,多型指的是:具有不同功能的函式可以用同一個函式名,可以用一個函式名呼叫不同內容的函式。 C++的多型分為兩種: 1. 靜態多型性(編譯時多型):在程式編譯時系統就能決定呼叫的是哪個函式,因此稱為編譯時多型

十二、事件,委托,泛委托,集合(泛非泛),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>func<t>委托,播委托,匿名方法,Lambda表達式,參數,事件)

multicast new 調用方法 多播 ted 被調用 輸入參數 pac cas 事件(Event) 事件是一種對象或類能夠提供通知的成員,客戶端可以通過提供事件處理程序為相應的事件可添加可執行代碼,事件可以理解為一種特殊的委托。 委托(Delegate) 委托是存有對

hbase內存規劃(讀寫少讀少

介紹 讀寫 包括 技術分享 image mark color heap cti //簡單說來主要包括讀多寫少型和寫多讀少型),內存的相關配置卻完全不同。 1、針對不同應用場景,對多種工作模式下的參數進行詳細說明,並結合相關示例對集群規劃中最核心模塊-內存規劃進行介紹。2、H

動態語言靜態語言

其它 ssi 編程 needed 有變 pin scrip ava 聲明 我們通常說的動態語言、靜態語言就是指的動態類型語言和靜態類型語言。 動態類型語言 動態類型語言是指在運行期間才去做數據類型檢查的語言。也就是說,在用動態類型的語言編程時,永遠不用給任何變量指定數據

C#基礎知識-引用類值類的區別(六)

值類型 type 調用 執行 new 內存堆 ada ont 不同類 在第一篇中我們介紹了C#中基本的15種數據類型,這15種數據類型中又分為兩大類,一種是值類型,一種是引用類型。值類型有sbyte、short、long、int、byte、ushort、uint、u

C#中的值類引用類以及堆棧

堆棧 ima tro nbsp 在線 hid class類 sed pen 引用類型如:string,Object,class等總是在從托管堆上分配的,C#中new操作符返回對象的內存地址--也就是指向對象數據的內存地址。 以下是值類型與引用類型的表: 我們來看下

C# Unix時間戳DateTime類相互轉換

c# double timezone 時間戳 convert ret mil alt 相互轉換      /// <summary> /// 將Unix時間戳轉換為DateTime類型時間 /// </summary>

淺談C#中的值類引用類

title log 創建 編譯 設計 編寫 通過 發布 構造 在C#中,值類型和引用類型是相當重要的兩個概念,必須在設計類型的時候就決定類型實例的行為。如果在編寫代碼時不能理解引用類型和值類型的區別,那麽將會給代碼帶來不必要的異常。很多人就是因為沒有弄清楚這兩個概念從而在編

【.Net】淺談C#中的值類引用類

rem 理解 amp div net 親情 實例 函數 大小 在C#中,值類型和引用類型是相當重要的兩個概念,必須在設計類型的時候就決定類型實例的行為。如果在編寫代碼時不能理解引用類型和值類型的區別,那麽將會給代碼帶來不必要的異常。很多人就是因為沒有弄清楚這兩個概念從而在編

C#值類引用類

ons 獨立 賦值 之間 創建 1=1 簡單 中心 lin 值類型和引用類型通俗來講:就是存儲的地方不一樣, 值類型 int double bool char struct(結構) enum(枚舉) 存放在托管堆上邊, 引用類型:string object class