面向对象编程世界总是以显式接口(explicit interfaces)和运行期多态(runtime polymorphism)解决问题。

例如:

class Computer
{
public:
	virtual void CpuRun()
	{
		//......
	}
	//...
};

Computer类的对象必定含有CpuRun()接口,它在源代码中是可见的,因此它是显式接口。

由于该函数是virtual函数,因此该函数的实现可能会出现运行期多态,也就是具体的函数实现由运行期的情况而定。


在Template及泛型编程的世界,显式接口和运行期多态的重要性降低。

在这个世界中,隐式接口(implicit interface)和编译期多态(compile-time polymorphism)更重要。


下面来看一个template函数:

template <typename T>
void DoSomething(T& arg)
{
	arg.Show();
	//......
}


1、arg支持哪些接口,由这个模板函数中的操作决定。如:Show()接口就是T必须具有的隐式接口。

2、由于不同的template参数具现化不同的函数模板,导致调用不同的函数,这便是编译期多态。


通常显式接口由函数签名式(也就是函数名称,参数类型,返回类型)构成。

隐式接口并不基于签名式,而是由有效表达式组成。如上面的Show().