zoukankan      html  css  js  c++  java
  • Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数

    本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie


    经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例
    演示样例:
    class B{
    public:
    	void mf();
    	//...
    };
    class D: public B{
    public:
    	void mf(); // 遮掩了B::mf。Item 33 名称遮掩规则
    }
    
    
    D x;
    B *pB = &x;
    D *pD = &x;
    pB->mf(); // 调用  B::mf
    pD->mf(); // 调用  D::mf


    解析:
    1.non-virtual函数是静态绑定的。 pB声明的类型(pointer-to-B)是静态的,而pB指向的类型(class D)是动态的。
    通过pB 调用的 non-virtual函数永远是B所定义的版本号
    2.
    public 继承意味着is-a,适用于B对象的每一件事,也适用于D对象,由于每一个D对象都是一个B对象
    不变性凌驾特异性,B的derived classes一定会继承 mf 的接口和实现。由于 mf是B的一个 non-virtual 函数
    又一次定义继承 non-virtual函数后产生的茅盾:
    假设D真有必要实现出与B不同的mf,那么“每一个D都是一个B”就不为真。就不应该以 public 形式继承 B
    假设D真的必须以 public 形式继承B,而且假设D越有须要实现出与B不同的 mf,那mf就无法为B反映出“不变性凌驾特异性”的性质


  • 相关阅读:
    ssh: connect to host port 22: Connection refused
    mysql安装出现 conflicts with mysql*的解决办法
    Linux 搭建互信后,仍需要密码验证
    正则表达式的小技巧
    基础的正则表达式与re模块(2)
    包的导入
    import模块
    模块的导入
    logging 模块
    hashlib 模块
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5254783.html
Copyright © 2011-2022 走看看