其中靜多態(tài)就是綁定發(fā)生在編譯期(compile-time),此種綁定稱為靜態(tài)綁定static-binding);而動多態(tài)就是綁定發(fā)生在運行期(run-time),此種綁定稱為動態(tài)綁定(dynamic-binding)。
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);
不同編程范例中的表現(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 {
// ...
};
靜定的概念:僅用平衡方程可以確定全部內(nèi)力和約束力的幾何不變結(jié)構(gòu)。因為靜定結(jié)構(gòu)撤銷約束或不適當?shù)母募s束配置可以使其變成可變體系,而增加約束又可以使其成為有多余約束的不變體系(即超靜定結(jié)構(gòu))。在靜定結(jié)構(gòu)...
還可以的
您好,小區(qū)現(xiàn)在房價在6080,小區(qū)周圍設(shè)施不錯。
優(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="tp6wkcs" class="single-tag-height">466KB
頁數(shù): 未知
評分: 4.8
基于多態(tài)并行處理器提出了一種硬件線程管理器,支持MIMD模式8個線程管理操作和SIMD模式SC控制器統(tǒng)一管理兩種工作模式,實現(xiàn)了線程級并行計算;可以監(jiān)測各個線程的工作情況以及近鄰?fù)ㄐ偶拇嫫骱吐酚善鞯臓顟B(tài);能夠在通信時停止、切換、啟動線程,記錄每個線程的工作狀態(tài),同時避免了因數(shù)據(jù)阻塞帶來的等待問題,能夠最大程度地提高單個處理器的執(zhí)行效率。
格式:pdf
大?。?span id="6ugsbo4" class="single-tag-height">466KB
頁數(shù): 未知
評分: 4.6
設(shè)計和實現(xiàn)了一種多態(tài)并行處理器中的SIMD控制器。為滿足圖像并行處理的需要,以實現(xiàn)高效的數(shù)據(jù)級并行計算為目標,采用狀態(tài)機實現(xiàn)了行、列、簇控制器的設(shè)計,完成了SIMD指令的發(fā)送、數(shù)據(jù)的加載和遠程數(shù)據(jù)的傳輸。在陣列機上分區(qū)并發(fā)實現(xiàn)了SIMD和MIMD兩種計算模式,能夠?qū)崿F(xiàn)兩種計算模式的切換。專用的硬件電路設(shè)計提高了該處理器處理并行數(shù)據(jù)的能力。
設(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)定性問題時,則用氣動彈性力學(xué)方法研究。
計算和分析結(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單晶薄膜中傳播靜磁波。