条款41:了解隐式接口和编译期多态

面向对象编程总是以显示接口和运行期多态解决问题,考虑如下代码:

// 无意义的class
class Widget {
public:
	Widget();
	virtual ~Widget();
	virtual void std::size_t size() const;
	virtual void normalize();
	void swap(Widget &other);
};

// 一个无意义的函数
void doProcessing (Widget &w) {
	if (w.size() > 0 && w != someNastWidget) {
		Widget temp(w);
		temp.normalize();
		temp.swap(w);
	}
}
  • 由于w的类型被声明为Widget,所以w必须支持Widget接口,这称为一个显示接口(因为我们可以找出Widget的源代码)
  • 由于Widgetvirtual成员函数,w对哪些函数的调用将表现出运行期多态

如果我们将doProcessing从函数转为函数模板呢?:

template<typename T>
void doProcessing(T &w) {
	if (w.size() > 10 && w != someNastyWidget) {
		T temp(w);
		temp.normalize();
		temp.swap(w);
	}
}
  • 现在w必须支持一种接口,系由template中执行于w身上的操作来决定
  • 凡涉及w的任何函数调用,例如operator>operator!=,有可能造成template的具现化(发生在编译期)

通常显式接口由函数的签式(也就是函数名称,参数类型,返回类型)构成,例如Widget class:

class Widget {
public:
	Widget();
	virtual ~Widget();
	virtual void std::size_t size() const;
	virtual void normalize();
	void swap(Widget &other);
};

隐式接口并不基于函数签名式,而是有效表达式:

template<typename T>
void doProcessing(T &w) {
	if (w.size() > 10 && w != someNastyWidget) {
		// ...
	}
}
  • classestemplates都支持接口和多态
  • classes而言接口是显式的,以函数签名为中心,多态则是通过virtual函数发生于运行期
  • template参数而言,接口是隐式的,基于有效表达式;多态是通过template具现化和函数重载解析发生于编译期
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值