Effective C++读书笔记——item41(隐式接口和编译期多态)

  1. 面向对象编程中的显式接口与运行期多态
    • 显式接口:在面向对象编程中,类的接口是显式的,可在源代码(如类的头文件)中直接看到。例如:
class Widget {
public:
    Widget();
    virtual ~Widget();
    virtual std::size_t size() const;
    virtual void normalize();
    void swap(Widget& other);
};

Widget类的显式接口由构造函数、析构函数、sizenormalizeswap函数及其参数类型、返回类型和常量性等组成。

  • 运行期多态:通过虚拟函数实现。当函数调用涉及虚拟函数时,被调用的特定函数在运行期基于对象的动态类型确定。例如:
void doProcessing(Widget& w) {
    if (w.size() > 10 && w!= someNastyWidget) {
        Widget temp(w);
        temp.normalize();
        temp.swap(w);
    }
}

doProcessing函数中,w对虚拟函数的调用表现为运行期多态。

  1. 模板和泛型编程中的隐式接口与编译期多态
    • 隐式接口:模板中参数必须支持的接口是隐式的,由模板中对该参数执行的操作所确定的合法表达式组成。例如:
template<typename T>
void doProcessing(T& w) {
    if (w.size() > 10 && w!= someNastyWidget) {
        T temp(w);
        temp.normalize();
        temp.swap(w);
    }
}

这里Tw的类型)的隐式接口要求T必须提供sizenormalizeswap成员函数,支持拷贝构造函数,以及支持!=比较操作。但这些要求并不绝对,例如size函数返回类型不一定是整数,只要能满足后续operator>的调用即可;!=操作也不一定要求T直接支持,只要存在合适的隐式转型能使operator!=调用合法就行。

  • 编译期多态:对包含模板参数的函数调用,如operator>operator!=,可能会在编译期实例化模板以使调用成功。用不同模板参数实例化函数模板会导致调用不同的函数,这就是编译期多态。例如,当使用不同类型实例化doProcessing模板时,会根据类型特性生成不同的函数实现。

总之,类和模板都支持接口和多态,但类的接口是显式的,以函数识别特征为中心,多态通过虚拟函数在运行期实现;模板参数的接口是隐式的,基于合法表达式,多态通过模板实例化和函数重载解析在编译期实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值