博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ 37绝不重新定义继承而来的缺省参数值
阅读量:5233 次
发布时间:2019-06-14

本文共 857 字,大约阅读时间需要 2 分钟。

  记得之前有同事吐槽过Java中居然没有缺省参数这个东西,想要达到缺省参数的目的只能靠蹩脚的函数重载。但今天发现了C++中缺省参数的坑。

  C++中的virtual函数是动态绑定的,而缺省值却是静态绑定的。

  举例来说:

    class Shape{

    public:

      virturl void draw(Color c = red ) const = 0;

    }

    class Circle : public Shape{

    public:

      virturl void draw(Color c = green ) const;

    }

    Sharp* ps;

    Sharp* pc = new Circle;

  pc的静态类型是Sharp,而动态类型为Circle.

  由于动态绑定技术,pc 可以通过虚表找到自己的虚函数,而c++因效率原因而让缺省值静态绑定,所以当pc调用draw时的默认参数是red,这一定是一个非常难以发现的BUG

  如果让他们都有相同的默认参数,则又代码重复,比较好的解决方式是:

    

    class Shape{

    public:

      void draw(Color c = red ) const{

        ondraw(c);

      }

    private:

      virtual void draw(Color c) const;

    }

    class Circle : public Shape{

    private:

      virtual void draw(Color c) const;

    };

所以,我们唯一应该覆写的东西是virtual函数,所以应该把静态绑定的东西(缺省参数)定义在non-virtual函数中。

转载于:https://www.cnblogs.com/dk666/p/8035113.html

你可能感兴趣的文章
POJ1664|DFS水题
查看>>
[php]http的状态码
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
在Spark中尽量少使用GroupByKey函数(转)
查看>>
PS 滤镜— — sparkle 效果
查看>>
我(webabcd)的文章索引
查看>>
snmpwalk命令常用方法总结
查看>>
.gitignore 配置
查看>>
网站产品设计
查看>>
TCP/IP协议
查看>>
如何修改被编译后DLL文件 (转发)
查看>>
C++按格式接收输入字符(京东,滴滴,360笔试必用)
查看>>
POJ 2255 Tree Recovery
查看>>
代理ARP
查看>>
Python 的 sys 模块常用方法?
查看>>
Java hashCode() 方法深入理解 ...
查看>>
Modbus TCP 示例报文
查看>>