1)非參數(shù)化多態(tài)(Ad-hoc polymorphism):
a)函數(shù)重載(Function Overloading)
b)運算符重載(Operator Overloading)
2)參數(shù)化多態(tài)(Parametric polymorphism)
c)模板(Template)
其實非參數(shù)化多態(tài)和參數(shù)化多態(tài)并不沖突,而且相輔相成,它們混合使用能夠帶來更大的靈活性,函數(shù)模板重載就是很好的例子:
template
T max(const T& lhs, const T& rhs)
{
return lhs > rhs "para" label-module="para">
}
template
T max(const T& fst, const T& sec, const T& thd)
{
return max(max(fst, sec), thd);
}
使用:
max(1, 3, 5);
max(2.4, 4.2);
其中靜多態(tài)就是綁定發(fā)生在編譯期(compile-time),此種綁定稱為靜態(tài)綁定static-binding);而動多態(tài)就是綁定發(fā)生在運行期(run-time),此種綁定稱為動態(tài)綁定(dynamic-binding)。
不同編程范例中的表現(xiàn)形式
注:由于C 同時支持下面要提到的三種編程范例(Programming Paradigm) ,所以就用C 語言為例來說明
C 中對靜多態(tài)的支持方式有:全局函數(shù)重載和運算符重載。
全局函數(shù)重載代碼:
一下代碼中均不考慮函數(shù)的返回類型,因為C 中不允許只有函數(shù)類型不同的重載。
1)參數(shù)個數(shù)不同而參數(shù)類型相同(對應(yīng)位置):
void defParamNum(int paramFst);
void defParamNum(int paramFst, double paramSec);
2)參數(shù)個數(shù)相同而參數(shù)類型不同:
void defParamType (int paramFst, double paramSec);
void defParamType (double paramFst, int paramSec);
3)參數(shù)個數(shù)和參數(shù)類型都不相同:
void defBoth(int paramFst);
void defBoth(double paramFst, int paramSec);
運算符重載代碼:
其實運算符重載也是一種函數(shù)重載。其中多了一些限制,比如一元運算符、二元運算符所要求的參數(shù)個數(shù),還有運算符重載的元型(Prototype)都有明確的規(guī)定,再就是一些像C語言等不支持運算符重載,所以這里單獨列出來。
一元運算符重載:(負值運算符 operator -)
Complex operator – (const Complex& elem)
{
// 復(fù)數(shù)temp的值為0 0i
Complex temp;
// 將temp的實部設(shè)為elem實部負數(shù)
temp.setReal(-elem.getReal());
// 將temp的虛部設(shè)為elem虛部的負數(shù)
temp.setImage(-elem.getImage());
// 返回temp復(fù)數(shù),此時temp就是elem對應(yīng)的負數(shù)了
return temp;
}
二元運算符重載:(加法運算符 operator )
Complex operator (const Complex& lhs, const Complex& rhs)
{
// 復(fù)數(shù)temp的值為0 0i
Complex temp;
// 將temp的實部設(shè)為lhs和rhs實部的和
temp.setReal(lsh.getReal() rhs.getReal());
// 將temp的虛部設(shè)為lhs和rhs虛部的和
temp.setImage(lsh.getImage() rhs.getImage());
// 返回temp復(fù)數(shù),此時的temp就是lhs和rhs的和
return temp;
}
其實面向?qū)ο缶幊蹋∣bject-Oriented Programming)中也表現(xiàn)為函數(shù)重載和運算符重載。
函數(shù)重載:成員函數(shù)重載,靜態(tài)成員函數(shù)(static)重載,虛函數(shù)重載,友元函數(shù)重載。
class Complex {
public:
// 構(gòu)造函數(shù)重載:
Complex() : m_real(0), m_image(0) { };
Complex(double real, double image) : m_real(real), m_image(image) { };
// 靜態(tài)成員函數(shù)重載:不恰當?shù)睦?
staticvoid staticFunc()
{
std::cout << "staticFunc()" << std::endl;
}
staticvoid staticFunc(int oneParam)
{
std::cout << "staticFunc(int oneParam)" << std::endl;
}
// 虛函數(shù)重載:不恰當?shù)睦?
virtualvoid virtualFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
virtualvoid virtualFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
// 虛函數(shù)重載:不恰當?shù)睦?。其友元函?shù)就是一般的全局函數(shù)
friendvoid friendFunc();
friendvoid friendFunc(int oneParam);
// 運算符重載:Comple Comple
// Complex Complex成員版本:允許一個complex對象和另一個Complex對象相加
Complex operator (const Complex& elem)
{
return Complex(m_real elem.m_real, m_image elem.m_image);
}
// Complex double成員版本:允許一個complex對象和另一個double對象相加
// 只能是Complex double,不能是double Complex
Complex operator (double elem)
{
return Complex(m_real elem, m_image);
}
// Complex Complex友元版本:允許一個complex對象和另一個Complex對象相加
friend Complex operator (const Complex& lsh, const Complex& rhs)
{
return Complex(lsh.m_real rhs.m_real, lsh.m_image rhs.m_image);
}
// Complex double友元版本:允許一個complex對象和另一個double對象相加
// 只能是Complex double,不能是double Complex
friend Complex operator (const Complex& lsh, double rhs)
{
return Complex(lsh.m_real rhs, lsh.m_image);
}
// double Complex友元版本:允許一個double對象和另一個Complex對象相加
//只能是double Complex,不能是Complex double
//和上面的Complex double友元版本相輔相成
friend Complex operator (double lhs, const Complex& rhs)
{
return Complex(lhs rhs.m_real, rhs.m_image);
}
private:
double m_real;
double m_image;
};
void friendFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
void friendFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
運算符重載:運算符成員式重載,運算符友元式重載。
注:見Complex類定義中的運算符重載部分!
在C 中,泛型編程(Generic Programming) 是通關(guān)過模板來實現(xiàn)的,然而模板不是與上述兩種編程范例有所不同,它必須依附于上述的某種范例,在某范例的基礎(chǔ)上來實現(xiàn),就像面向?qū)ο蠛瓦^程化編程的關(guān)系一樣。下面就是模板分類:
按泛化對象可分為:
1)類型泛化(Type):
template
class List {
// ...
};
List iList; // iList是能夠存儲int類型的鏈表對象
2)數(shù)值泛化(Value):
template
class Bit {
// ...
};
Bit<3> bit3; // bit3是長度為3位的位對象
3)數(shù)值和類型泛化(Type & Value):
template
class Array {
// ...
};
Array iArray3; // iArray3是能夠存儲3個int類型的數(shù)組對象
按泛化的載體可分為:
函數(shù)模板:
template
void functionGeneric()
{
// ...
}
類模板:
template
class classGeneric {
// ...
};
按照鏈路速率的不同進行分類的 雙絞線常見的有3類線,5類線(100M)和超5類(155M),以及最新的6類線(255M),前者線徑細而后者線徑粗,型號如下: 1)一類線:主要用于傳輸語音(一類...
鋼筋按其屈服能力分成以下這幾種 鋼筋牌號不同 價格不同
機械行業(yè)的主要產(chǎn)品包括以下12類: (1)農(nóng)業(yè)機械:拖拉機、播種機、收割機械等。 (2)重型礦山機械:冶金機械、礦山機械、起重機械、裝卸機械、工礦車輛、水泥設(shè)備等。 (3)工程機械:叉車、鏟土運輸機械...
優(yōu)缺點比較
靜多態(tài)是以犧牲靈活性而獲得運行速度的一種做法;而動多態(tài)則恰恰相反,它是以犧牲運行速度而獲取靈活性的做法。當然這么說是不全面的,看看下面這個特殊的應(yīng)用:
使用靜多態(tài)來實現(xiàn)動多態(tài)
這是一種在模板元編程(Template Metaprogramming)中常見的標準編程技巧。在C 中,可以借助模板來實現(xiàn)面向?qū)ο笳Z言所支持動多態(tài)相似的功能特性(C 中指的就是的virtual 函數(shù))。
下面是C 本身所支持多態(tài)形式:(virtual版)
#include
class Base {
public:
virtual void method() = 0;
virtual ~Base() { }
};
class Derived : public Base {
public:
virtual void method()
{
std::cout << "Derived" << std::endl;
}
};
class Derived2 : public Base {
public:
virtual void method()
{
std::cout << "Derived2" << std::endl;
}
};
int main()
{ Base *pBase = new Derived;
pBase->method(); // 輸出:"Derived"
delete pBase;
Base *pBase2 = new Derived2;
pBase2->method(); // 輸出:"Derived2"
delete pBase2;
return 0;
}
注:C 本身是借助virtual關(guān)鍵字來實現(xiàn)多態(tài)的(dynamic polymorphism),而通常編譯器是借助virtual look-up tables(虛函數(shù)表)來決定該調(diào)用那個版本的函數(shù),當然這一過程發(fā)生在運行期。
下面是使用CRTP(Curiously Recurring Template Pattern)來實現(xiàn)多與上面對應(yīng)功能的靜多態(tài)代碼:
#include
template
class Base {
public:
void method()
{
// ...
static_cast(this)->implementation();
// ...
}
};
class Derived : private Base {
public:
void implementation()
{
std::cout << "Derived" << std::endl;
}
};
class Derived2 : private Base {
public:
void implementation()
{
std::cout << "Derived2" << std::endl;
}
};
int main()
{
Base *pBase = new Base();
pBase->method(); // 輸出:"Derived"
delete pBase;
Base *pBase2 = new Base();
pBase2->method(); // 輸出:"Derived2"
delete pBase2;
return 0;
}
雖然使用這種方式實現(xiàn)的多態(tài)和面向?qū)ο笾械亩鄳B(tài)從功能上說差不多相同,但是前者沒有后者易用、易懂、和能力強大。雖然如此,CRTP作為一種模板設(shè)計模式還是很有用的,例如,Boost iterator library就是用了這種方法來實現(xiàn)。
其實在別的語言中也存在CRTP這種模式,如Java,Enum類被定義為Enum>,當然由于Java在模板方面的不足,作為Java語言的使用者,你是沒法自己體驗這樣的用法(Java雖然支持模板特性,但是用戶不能自己定義模板,只能使用庫里邊的模板類)。2100433B
格式:pdf
大?。?span id="wnup0pu" class="single-tag-height">5KB
頁數(shù): 2頁
評分: 4.7
液壓控制閥的具體分類及其工作原理 壓力控制閥 按用途分為溢流閥﹑減壓閥和順序閥。 (1)溢流 閥:能控制液壓系統(tǒng)在達到調(diào)定壓力時保持恆定狀態(tài)。 用於過載保 護的溢流閥稱為安全閥。 當系統(tǒng)發(fā)生故障, 壓力昇高到可能造成破 壞的限定值時,閥口會打開而溢流,以保證系統(tǒng)的安全。 (2) 減壓閥:能控制分支迴路得到比主迴路油壓低的穩(wěn)定壓力。減壓閥 按它所控制的壓力功能不同,又可分為定值減壓閥 (輸出壓力為恆 定值 )﹑定差減壓閥 (輸入與輸出壓力差為定值 )和定比減壓閥 (輸入 與輸出壓力間保持一定的比例 )。 (3)順序閥:能使一個執(zhí)行元 件(如液壓缸﹑液壓馬達等 )動作以后,再按順序使其他執(zhí)行元件動 作。油泵產(chǎn)生的壓力先推動液壓缸 1運動,同時通過順序閥的進油 口作用在面積 A 上,當液壓缸 1運動完全成后, 壓力昇高,作用在 面積 A 的向上推力大於彈簧的調(diào)定值后, 閥芯上昇使進油口與出油 口
格式:pdf
大小:5KB
頁數(shù): 5頁
評分: 4.8
水性工業(yè)漆的分類有哪些 水性工業(yè)油漆的分類按照防銹漆來分一般分為丙烯酸類水性防 銹油漆、醇酸類防銹油漆、 環(huán)氧類水性防銹油漆、氨基型水性防銹油 漆、酚醛水性防銹油漆等幾大類,按工藝上來講有自干型、烘烤型、 浸涂型幾種。下面簡單的為大家介紹幾種常見的水性工業(yè)油漆。 一、 丙烯酸類水性防銹油漆 丙烯酸類水性防銹油漆最常見的是水性鐵紅丙烯酸防銹漆, 下面 就列舉水性鐵紅丙烯酸防銹漆為例: 1、特點:水性鐵紅丙烯酸防銹漆屬自干型涂料,具有優(yōu)良的附 著力、耐熱性、耐候性、耐腐蝕性和抗沾污性等特點,并能與醇酸、 氨基、硝基等多種面漆配套使用, 在某些性能方面優(yōu)于紅丹酚醛防銹 漆和紅丹醇酸防銹漆。 2、用途:主要用途可應(yīng)用于各種機械、 船舶、車輛、橋梁和儀 器儀表的防腐蝕涂裝,特別適用在通風不暢的環(huán)境中施工。 3、環(huán)保性:涂料用水作溶劑無毒害、不燃不爆、對環(huán)境污染少, 保障了工作人員的身體健康。產(chǎn)品便于
設(shè)備大分類分為動設(shè)備,靜設(shè)備。
動設(shè)備是指有驅(qū)動機帶動的轉(zhuǎn)動設(shè)備,如泵、壓縮機、風機、電機以及成型機、包裝機、攪拌機等等;靜設(shè)備主要是指爐類、塔類、反應(yīng)設(shè)備類、儲罐類、換熱設(shè)備類等。其中,比較特殊的有空冷器等,空冷風機需要按動設(shè)備管理,空冷管束按靜設(shè)備管理。
在國際分類中,靜設(shè)備一般指非旋轉(zhuǎn)設(shè)備,而動設(shè)備指旋轉(zhuǎn)設(shè)備。
靜設(shè)備圖片2100433B
靜強度分析包括下面幾個方面的工作。
校核結(jié)構(gòu)的承載能力是否滿足強度設(shè)計的要求,若強度過剩較多,可以減小結(jié)構(gòu)承力件尺寸。對于帶裂紋的結(jié)構(gòu),由于裂紋尖端存在奇異的應(yīng)力分布,常規(guī)的靜強度分析方法已不再適用,已屬于疲勞與斷裂問題。
校核結(jié)構(gòu)抵抗變形的能力是否滿足強度設(shè)計的要求,同時為動力分析等提供結(jié)構(gòu)剛度特性數(shù)據(jù),這種校核通常在使用載荷下或更小的載荷下進行。
計算和校核桿件、板件、薄壁結(jié)構(gòu)、殼體等在載荷作用下是否會喪失穩(wěn)定。有空氣動力、彈性力耦合作用的結(jié)構(gòu)穩(wěn)定性問題時,則用氣動彈性力學方法研究。
計算和分析結(jié)構(gòu)在靜載荷作用下的應(yīng)力、變形分布規(guī)律和屈曲模態(tài),為其他方面的結(jié)構(gòu)分析提供資料。
靜強度分析的內(nèi)容也可通過靜力試驗測定或驗證。
在鐵磁共振實驗的附加峰(副峰)中,1956年,R.L.懷特和I.H.索爾特首次觀察了亞鐵磁體中的靜磁模。1961年,R.W.達蒙等研究了平面結(jié)構(gòu)中的靜磁模。1965年,F.A.奧爾森在YIG(釔鐵石榴石)單晶上觀察到表面自旋波的傳播。70年代開始研究在 GGG(釔鎵石榴石)上外延YIG單晶薄膜中傳播靜磁波。