选择特殊符号
选择搜索类型
请输入搜索
1)非参数化多态(Ad-hoc polymorphism):
a)函数重载(Function Overloading)
b)运算符重载(Operator Overloading)
2)参数化多态(Parametric polymorphism)
c)模板(Template)
其实非参数化多态和参数化多态并不冲突,而且相辅相成,它们混合使用能够带来更大的灵活性,函数模板重载就是很好的例子:
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);
优缺点比较
静多态是以牺牲灵活性而获得运行速度的一种做法;而动多态则恰恰相反,它是以牺牲运行速度而获取灵活性的做法。当然这么说是不全面的,看看下面这个特殊的应用:
使用静多态来实现动多态
这是一种在模板元编程(Template Metaprogramming)中常见的标准编程技巧。在C 中,可以借助模板来实现面向对象语言所支持动多态相似的功能特性(C 中指的就是的virtual 函数)。
下面是C 本身所支持多态形式:(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关键字来实现多态的(dynamic polymorphism),而通常编译器是借助virtual look-up tables(虚函数表)来决定该调用那个版本的函数,当然这一过程发生在运行期。
下面是使用CRTP(Curiously Recurring Template Pattern)来实现多与上面对应功能的静多态代码:
#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;
}
虽然使用这种方式实现的多态和面向对象中的多态从功能上说差不多相同,但是前者没有后者易用、易懂、和能力强大。虽然如此,CRTP作为一种模板设计模式还是很有用的,例如,Boost iterator library就是用了这种方法来实现。
其实在别的语言中也存在CRTP这种模式,如Java,Enum类被定义为Enum>,当然由于Java在模板方面的不足,作为Java语言的使用者,你是没法自己体验这样的用法(Java虽然支持模板特性,但是用户不能自己定义模板,只能使用库里边的模板类)。2100433B
其中静多态就是绑定发生在编译期(compile-time),此种绑定称为静态绑定static-binding);而动多态就是绑定发生在运行期(run-time),此种绑定称为动态绑定(dynamic-binding)。
还可以的
您好,小区现在房价在6080,小区周围设施不错。
你好,经过我对业内人士的咨询:3400提货价不管装,装好3600,卖场最低35的要3900了,32的便宜100元,你可以找一般的家电维修店让他们联系,保修什么的都一样,一台最少便宜200左右,看机器只...
不同编程范例中的表现形式
注:由于C 同时支持下面要提到的三种编程范例(Programming Paradigm) ,所以就用C 语言为例来说明
C 中对静多态的支持方式有:全局函数重载和运算符重载。
全局函数重载代码:
一下代码中均不考虑函数的返回类型,因为C 中不允许只有函数类型不同的重载。
1)参数个数不同而参数类型相同(对应位置):
void defParamNum(int paramFst);
void defParamNum(int paramFst, double paramSec);
2)参数个数相同而参数类型不同:
void defParamType (int paramFst, double paramSec);
void defParamType (double paramFst, int paramSec);
3)参数个数和参数类型都不相同:
void defBoth(int paramFst);
void defBoth(double paramFst, int paramSec);
运算符重载代码:
其实运算符重载也是一种函数重载。其中多了一些限制,比如一元运算符、二元运算符所要求的参数个数,还有运算符重载的元型(Prototype)都有明确的规定,再就是一些像C语言等不支持运算符重载,所以这里单独列出来。
一元运算符重载:(负值运算符 operator -)
Complex operator – (const Complex& elem)
{
// 复数temp的值为0 0i
Complex temp;
// 将temp的实部设为elem实部负数
temp.setReal(-elem.getReal());
// 将temp的虚部设为elem虚部的负数
temp.setImage(-elem.getImage());
// 返回temp复数,此时temp就是elem对应的负数了
return temp;
}
二元运算符重载:(加法运算符 operator )
Complex operator (const Complex& lhs, const Complex& rhs)
{
// 复数temp的值为0 0i
Complex temp;
// 将temp的实部设为lhs和rhs实部的和
temp.setReal(lsh.getReal() rhs.getReal());
// 将temp的虚部设为lhs和rhs虚部的和
temp.setImage(lsh.getImage() rhs.getImage());
// 返回temp复数,此时的temp就是lhs和rhs的和
return temp;
}
其实面向对象编程(Object-Oriented Programming)中也表现为函数重载和运算符重载。
函数重载:成员函数重载,静态成员函数(static)重载,虚函数重载,友元函数重载。
class Complex {
public:
// 构造函数重载:
Complex() : m_real(0), m_image(0) { };
Complex(double real, double image) : m_real(real), m_image(image) { };
// 静态成员函数重载:不恰当的例子
staticvoid staticFunc()
{
std::cout << "staticFunc()" << std::endl;
}
staticvoid staticFunc(int oneParam)
{
std::cout << "staticFunc(int oneParam)" << std::endl;
}
// 虚函数重载:不恰当的例子
virtualvoid virtualFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
virtualvoid virtualFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
// 虚函数重载:不恰当的例子。其友元函数就是一般的全局函数
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) 是通关过模板来实现的,然而模板不是与上述两种编程范例有所不同,它必须依附于上述的某种范例,在某范例的基础上来实现,就像面向对象和过程化编程的关系一样。下面就是模板分类:
按泛化对象可分为:
1)类型泛化(Type):
template
class List {
// ...
};
List iList; // iList是能够存储int类型的链表对象
2)数值泛化(Value):
template
class Bit {
// ...
};
Bit<3> bit3; // bit3是长度为3位的位对象
3)数值和类型泛化(Type & Value):
template
class Array {
// ...
};
Array iArray3; // iArray3是能够存储3个int类型的数组对象
按泛化的载体可分为:
函数模板:
template
void functionGeneric()
{
// ...
}
类模板:
template
class classGeneric {
// ...
};
多态并行处理器中的线程管理器设计
基于多态并行处理器提出了一种硬件线程管理器,支持MIMD模式8个线程管理操作和SIMD模式SC控制器统一管理两种工作模式,实现了线程级并行计算;可以监测各个线程的工作情况以及近邻通信寄存器和路由器的状态;能够在通信时停止、切换、启动线程,记录每个线程的工作状态,同时避免了因数据阻塞带来的等待问题,能够最大程度地提高单个处理器的执行效率。
多态并行处理器中的SIMD控制器设计与实现
设计和实现了一种多态并行处理器中的SIMD控制器。为满足图像并行处理的需要,以实现高效的数据级并行计算为目标,采用状态机实现了行、列、簇控制器的设计,完成了SIMD指令的发送、数据的加载和远程数据的传输。在阵列机上分区并发实现了SIMD和MIMD两种计算模式,能够实现两种计算模式的切换。专用的硬件电路设计提高了该处理器处理并行数据的能力。
设备大分类分为动设备,静设备。
动设备是指有驱动机带动的转动设备,如泵、压缩机、风机、电机以及成型机、包装机、搅拌机等等;静设备主要是指炉类、塔类、反应设备类、储罐类、换热设备类等。其中,比较特殊的有空冷器等,空冷风机需要按动设备管理,空冷管束按静设备管理。
在国际分类中,静设备一般指非旋转设备,而动设备指旋转设备。
静设备图片2100433B
静强度分析包括下面几个方面的工作。
校核结构的承载能力是否满足强度设计的要求,若强度过剩较多,可以减小结构承力件尺寸。对于带裂纹的结构,由于裂纹尖端存在奇异的应力分布,常规的静强度分析方法已不再适用,已属于疲劳与断裂问题。
校核结构抵抗变形的能力是否满足强度设计的要求,同时为动力分析等提供结构刚度特性数据,这种校核通常在使用载荷下或更小的载荷下进行。
计算和校核杆件、板件、薄壁结构、壳体等在载荷作用下是否会丧失稳定。有空气动力、弹性力耦合作用的结构稳定性问题时,则用气动弹性力学方法研究。
计算和分析结构在静载荷作用下的应力、变形分布规律和屈曲模态,为其他方面的结构分析提供资料。
静强度分析的内容也可通过静力试验测定或验证。
在铁磁共振实验的附加峰(副峰)中,1956年,R.L.怀特和I.H.索尔特首次观察了亚铁磁体中的静磁模。1961年,R.W.达蒙等研究了平面结构中的静磁模。1965年,F.A.奥尔森在YIG(钇铁石榴石)单晶上观察到表面自旋波的传播。70年代开始研究在 GGG(钇镓石榴石)上外延YIG单晶薄膜中传播静磁波。