// Define interface
class Widget {
public:
Widget();
virtual ~WIdget();
virtual std::size_t size() const;
virtual void Normalize();
void Swap(Widget &other);
// And something else.
};
// Use interface
void DoProcess(Widget &w) {
if (w.size() > 10) {
Widget tmp(w);
tmp.Normailze();
tmp.Swap(w);
}
}
面向对象编程使用如上的显式接口实现运行时多态。
接口,也就是 Widget
类的方法,被显式定义出来。而多态,即 w
对 size()
等方法的调用,在运行时根据 w
的动态类型确定一个函数指针,不同动态类型可能对应不同的函数指针,由此实现多态。
template <typename T>
void DoProcess(T &w) {
if (w.size() > 10) {
T tmp(w);
tmp.Normailze();
tmp.Swap(w);
}
}
而使用模板的方法,T
表示任何可以执行 DoProcess
之中 w
进行的操作的对象。接口是通过使用定义的,而不是直接写出的,是为隐式接口。不同类型的 T
使用此函数,执行的操作,也就是运行函数的指针 ,在编译时即可得到确认,是为编译期多态。
网友评论