中文名 | 靜多態(tài) | 外文名 | Static Polymorphism |
---|
1)非參數(shù)化多態(tài)(Ad-hoc polymorphism):
a)函數(shù)重載(Function Overloading)
b)運(yùn)算符重載(Operator Overloading)
2)參數(shù)化多態(tài)(Parametric polymorphism)
c)模板(Template)
其實(shí)非參數(shù)化多態(tài)和參數(shù)化多態(tài)并不沖突,而且相輔相成,它們混合使用能夠帶來(lá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);
優(yōu)缺點(diǎn)比較
靜多態(tài)是以犧牲靈活性而獲得運(yùn)行速度的一種做法;而動(dòng)多態(tài)則恰恰相反,它是以犧牲運(yùn)行速度而獲取靈活性的做法。當(dāng)然這么說(shuō)是不全面的,看看下面這個(gè)特殊的應(yīng)用:
使用靜多態(tài)來(lái)實(shí)現(xiàn)動(dòng)多態(tài)
這是一種在模板元編程(Template Metaprogramming)中常見(jiàn)的標(biāo)準(zhǔn)編程技巧。在C 中,可以借助模板來(lái)實(shí)現(xiàn)面向?qū)ο笳Z(yǔ)言所支持動(dòng)多態(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)鍵字來(lái)實(shí)現(xiàn)多態(tài)的(dynamic polymorphism),而通常編譯器是借助virtual look-up tables(虛函數(shù)表)來(lái)決定該調(diào)用那個(gè)版本的函數(shù),當(dāng)然這一過(guò)程發(fā)生在運(yùn)行期。
下面是使用CRTP(Curiously Recurring Template Pattern)來(lái)實(shí)現(xiàn)多與上面對(duì)應(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;
}
雖然使用這種方式實(shí)現(xiàn)的多態(tài)和面向?qū)ο笾械亩鄳B(tài)從功能上說(shuō)差不多相同,但是前者沒(méi)有后者易用、易懂、和能力強(qiáng)大。雖然如此,CRTP作為一種模板設(shè)計(jì)模式還是很有用的,例如,Boost iterator library就是用了這種方法來(lái)實(shí)現(xiàn)。
其實(shí)在別的語(yǔ)言中也存在CRTP這種模式,如Java,Enum類(lèi)被定義為Enum>,當(dāng)然由于Java在模板方面的不足,作為Java語(yǔ)言的使用者,你是沒(méi)法自己體驗(yàn)這樣的用法(Java雖然支持模板特性,但是用戶(hù)不能自己定義模板,只能使用庫(kù)里邊的模板類(lèi))。2100433B
其中靜多態(tài)就是綁定發(fā)生在編譯期(compile-time),此種綁定稱(chēng)為靜態(tài)綁定static-binding);而動(dòng)多態(tài)就是綁定發(fā)生在運(yùn)行期(run-time),此種綁定稱(chēng)為動(dòng)態(tài)綁定(dynamic-binding)。
還可以的
您好,小區(qū)現(xiàn)在房?jī)r(jià)在6080,小區(qū)周?chē)O(shè)施不錯(cuò)。
你好,經(jīng)過(guò)我對(duì)業(yè)內(nèi)人士的咨詢(xún):3400提貨價(jià)不管裝,裝好3600,賣(mài)場(chǎng)最低35的要3900了,32的便宜100元,你可以找一般的家電維修店讓他們聯(lián)系,保修什么的都一樣,一臺(tái)最少便宜200左右,看機(jī)器只...
不同編程范例中的表現(xiàn)形式
注:由于C 同時(shí)支持下面要提到的三種編程范例(Programming Paradigm) ,所以就用C 語(yǔ)言為例來(lái)說(shuō)明
C 中對(duì)靜多態(tài)的支持方式有:全局函數(shù)重載和運(yùn)算符重載。
全局函數(shù)重載代碼:
一下代碼中均不考慮函數(shù)的返回類(lèi)型,因?yàn)镃 中不允許只有函數(shù)類(lèi)型不同的重載。
1)參數(shù)個(gè)數(shù)不同而參數(shù)類(lèi)型相同(對(duì)應(yīng)位置):
void defParamNum(int paramFst);
void defParamNum(int paramFst, double paramSec);
2)參數(shù)個(gè)數(shù)相同而參數(shù)類(lèi)型不同:
void defParamType (int paramFst, double paramSec);
void defParamType (double paramFst, int paramSec);
3)參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型都不相同:
void defBoth(int paramFst);
void defBoth(double paramFst, int paramSec);
運(yùn)算符重載代碼:
其實(shí)運(yùn)算符重載也是一種函數(shù)重載。其中多了一些限制,比如一元運(yùn)算符、二元運(yùn)算符所要求的參數(shù)個(gè)數(shù),還有運(yùn)算符重載的元型(Prototype)都有明確的規(guī)定,再就是一些像C語(yǔ)言等不支持運(yùn)算符重載,所以這里單獨(dú)列出來(lái)。
一元運(yùn)算符重載:(負(fù)值運(yùn)算符 operator -)
Complex operator – (const Complex& elem)
{
// 復(fù)數(shù)temp的值為0 0i
Complex temp;
// 將temp的實(shí)部設(shè)為elem實(shí)部負(fù)數(shù)
temp.setReal(-elem.getReal());
// 將temp的虛部設(shè)為elem虛部的負(fù)數(shù)
temp.setImage(-elem.getImage());
// 返回temp復(fù)數(shù),此時(shí)temp就是elem對(duì)應(yīng)的負(fù)數(shù)了
return temp;
}
二元運(yùn)算符重載:(加法運(yùn)算符 operator )
Complex operator (const Complex& lhs, const Complex& rhs)
{
// 復(fù)數(shù)temp的值為0 0i
Complex temp;
// 將temp的實(shí)部設(shè)為lhs和rhs實(shí)部的和
temp.setReal(lsh.getReal() rhs.getReal());
// 將temp的虛部設(shè)為lhs和rhs虛部的和
temp.setImage(lsh.getImage() rhs.getImage());
// 返回temp復(fù)數(shù),此時(shí)的temp就是lhs和rhs的和
return temp;
}
其實(shí)面向?qū)ο缶幊蹋∣bject-Oriented Programming)中也表現(xiàn)為函數(shù)重載和運(yùn)算符重載。
函數(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ù)重載:不恰當(dāng)?shù)睦?
staticvoid staticFunc()
{
std::cout << "staticFunc()" << std::endl;
}
staticvoid staticFunc(int oneParam)
{
std::cout << "staticFunc(int oneParam)" << std::endl;
}
// 虛函數(shù)重載:不恰當(dāng)?shù)睦?
virtualvoid virtualFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
virtualvoid virtualFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
// 虛函數(shù)重載:不恰當(dāng)?shù)睦?。其友元函?shù)就是一般的全局函數(shù)
friendvoid friendFunc();
friendvoid friendFunc(int oneParam);
// 運(yùn)算符重載:Comple Comple
// Complex Complex成員版本:允許一個(gè)complex對(duì)象和另一個(gè)Complex對(duì)象相加
Complex operator (const Complex& elem)
{
return Complex(m_real elem.m_real, m_image elem.m_image);
}
// Complex double成員版本:允許一個(gè)complex對(duì)象和另一個(gè)double對(duì)象相加
// 只能是Complex double,不能是double Complex
Complex operator (double elem)
{
return Complex(m_real elem, m_image);
}
// Complex Complex友元版本:允許一個(gè)complex對(duì)象和另一個(gè)Complex對(duì)象相加
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友元版本:允許一個(gè)complex對(duì)象和另一個(gè)double對(duì)象相加
// 只能是Complex double,不能是double Complex
friend Complex operator (const Complex& lsh, double rhs)
{
return Complex(lsh.m_real rhs, lsh.m_image);
}
// double Complex友元版本:允許一個(gè)double對(duì)象和另一個(gè)Complex對(duì)象相加
//只能是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;
}
運(yùn)算符重載:運(yùn)算符成員式重載,運(yùn)算符友元式重載。
注:見(jiàn)Complex類(lèi)定義中的運(yùn)算符重載部分!
在C 中,泛型編程(Generic Programming) 是通關(guān)過(guò)模板來(lái)實(shí)現(xiàn)的,然而模板不是與上述兩種編程范例有所不同,它必須依附于上述的某種范例,在某范例的基礎(chǔ)上來(lái)實(shí)現(xiàn),就像面向?qū)ο蠛瓦^(guò)程化編程的關(guān)系一樣。下面就是模板分類(lèi):
按泛化對(duì)象可分為:
1)類(lèi)型泛化(Type):
template
class List {
// ...
};
List iList; // iList是能夠存儲(chǔ)int類(lèi)型的鏈表對(duì)象
2)數(shù)值泛化(Value):
template
class Bit {
// ...
};
Bit<3> bit3; // bit3是長(zhǎng)度為3位的位對(duì)象
3)數(shù)值和類(lèi)型泛化(Type & Value):
template
class Array {
// ...
};
Array iArray3; // iArray3是能夠存儲(chǔ)3個(gè)int類(lèi)型的數(shù)組對(duì)象
按泛化的載體可分為:
函數(shù)模板:
template
void functionGeneric()
{
// ...
}
類(lèi)模板:
template
class classGeneric {
// ...
};
格式:pdf
大?。?span id="gs6sosw" class="single-tag-height">466KB
頁(yè)數(shù): 未知
評(píng)分: 4.8
基于多態(tài)并行處理器提出了一種硬件線(xiàn)程管理器,支持MIMD模式8個(gè)線(xiàn)程管理操作和SIMD模式SC控制器統(tǒng)一管理兩種工作模式,實(shí)現(xiàn)了線(xiàn)程級(jí)并行計(jì)算;可以監(jiān)測(cè)各個(gè)線(xiàn)程的工作情況以及近鄰?fù)ㄐ偶拇嫫骱吐酚善鞯臓顟B(tài);能夠在通信時(shí)停止、切換、啟動(dòng)線(xiàn)程,記錄每個(gè)線(xiàn)程的工作狀態(tài),同時(shí)避免了因數(shù)據(jù)阻塞帶來(lái)的等待問(wèn)題,能夠最大程度地提高單個(gè)處理器的執(zhí)行效率。
格式:pdf
大?。?span id="6cuqeyw" class="single-tag-height">466KB
頁(yè)數(shù): 未知
評(píng)分: 4.6
設(shè)計(jì)和實(shí)現(xiàn)了一種多態(tài)并行處理器中的SIMD控制器。為滿(mǎn)足圖像并行處理的需要,以實(shí)現(xiàn)高效的數(shù)據(jù)級(jí)并行計(jì)算為目標(biāo),采用狀態(tài)機(jī)實(shí)現(xiàn)了行、列、簇控制器的設(shè)計(jì),完成了SIMD指令的發(fā)送、數(shù)據(jù)的加載和遠(yuǎn)程數(shù)據(jù)的傳輸。在陣列機(jī)上分區(qū)并發(fā)實(shí)現(xiàn)了SIMD和MIMD兩種計(jì)算模式,能夠?qū)崿F(xiàn)兩種計(jì)算模式的切換。專(zhuān)用的硬件電路設(shè)計(jì)提高了該處理器處理并行數(shù)據(jù)的能力。
設(shè)備大分類(lèi)分為動(dòng)設(shè)備,靜設(shè)備。
動(dòng)設(shè)備是指有驅(qū)動(dòng)機(jī)帶動(dòng)的轉(zhuǎn)動(dòng)設(shè)備,如泵、壓縮機(jī)、風(fēng)機(jī)、電機(jī)以及成型機(jī)、包裝機(jī)、攪拌機(jī)等等;靜設(shè)備主要是指爐類(lèi)、塔類(lèi)、反應(yīng)設(shè)備類(lèi)、儲(chǔ)罐類(lèi)、換熱設(shè)備類(lèi)等。其中,比較特殊的有空冷器等,空冷風(fēng)機(jī)需要按動(dòng)設(shè)備管理,空冷管束按靜設(shè)備管理。
在國(guó)際分類(lèi)中,靜設(shè)備一般指非旋轉(zhuǎn)設(shè)備,而動(dòng)設(shè)備指旋轉(zhuǎn)設(shè)備。
靜設(shè)備圖片2100433B
靜強(qiáng)度分析包括下面幾個(gè)方面的工作。
校核結(jié)構(gòu)的承載能力是否滿(mǎn)足強(qiáng)度設(shè)計(jì)的要求,若強(qiáng)度過(guò)剩較多,可以減小結(jié)構(gòu)承力件尺寸。對(duì)于帶裂紋的結(jié)構(gòu),由于裂紋尖端存在奇異的應(yīng)力分布,常規(guī)的靜強(qiáng)度分析方法已不再適用,已屬于疲勞與斷裂問(wèn)題。
校核結(jié)構(gòu)抵抗變形的能力是否滿(mǎn)足強(qiáng)度設(shè)計(jì)的要求,同時(shí)為動(dòng)力分析等提供結(jié)構(gòu)剛度特性數(shù)據(jù),這種校核通常在使用載荷下或更小的載荷下進(jìn)行。
計(jì)算和校核桿件、板件、薄壁結(jié)構(gòu)、殼體等在載荷作用下是否會(huì)喪失穩(wěn)定。有空氣動(dòng)力、彈性力耦合作用的結(jié)構(gòu)穩(wěn)定性問(wèn)題時(shí),則用氣動(dòng)彈性力學(xué)方法研究。
計(jì)算和分析結(jié)構(gòu)在靜載荷作用下的應(yīng)力、變形分布規(guī)律和屈曲模態(tài),為其他方面的結(jié)構(gòu)分析提供資料。
靜強(qiáng)度分析的內(nèi)容也可通過(guò)靜力試驗(yàn)測(cè)定或驗(yàn)證。
在鐵磁共振實(shí)驗(yàn)的附加峰(副峰)中,1956年,R.L.懷特和I.H.索爾特首次觀(guān)察了亞鐵磁體中的靜磁模。1961年,R.W.達(dá)蒙等研究了平面結(jié)構(gòu)中的靜磁模。1965年,F.A.奧爾森在YIG(釔鐵石榴石)單晶上觀(guān)察到表面自旋波的傳播。70年代開(kāi)始研究在 GGG(釔鎵石榴石)上外延YIG單晶薄膜中傳播靜磁波。