条款38:绝对不要重新定义继承而来的缺省参数值

1,首先可以安全的把问题讨论局限于"继承一个带有缺省参数的虚拟函数"
那么理由非常直接明了:
虚拟函数系动态绑定,而缺省参数却是静态绑定.

实例代码:
#include <iostream>
#include <string.h>

using namespace std;

enum ShapeColor { RED, GREEN, BLUE };
// a class for geometric shapes
class Shape
{
public:
    virtual void draw(ShapeColor color = RED)
    {
        cout << "Shape:" << color << endl;
    }
};
class Rectangle: public Shape
{
public:
    virtual void draw(ShapeColor color = GREEN) const
    {
        cout << "Ractangle:" << color << endl;
    }

};

int main()
{
    Shape* pb1 = new Shape;
    pb1 -> draw();

    Shape* pb2 = new Rectangle;
    pb2 -> draw(); //基类默认

    Rectangle* pb3 = new Rectangle;
    pb3 -> draw(); //派生类默认

    return 0;
}

注意:pb2 -> draw(); //基类默认
当你调用一个定义在Derived class内的虚拟函数时,却使用基类为它指定的缺省参数值.

2,C++为啥要坚持这么运作捏?
答案:又是执行时的效率.
如果缺省参数也是动态绑定,编译器就必须通过某种办法在执行时期为虚拟函数决定适当的缺省参数值.这样的机制更慢更复杂.

你可能感兴趣的:(C++,c,C#)