effective c++ 37 不重新定义继承而来的缺省参数值

程序员小x大约 2 分钟C++C++effective c++读书笔记

effective c++ 37 不重新定义继承而来的缺省参数值

本节主要讲解了和虚函数中的默认参数有关的话题。本节的话题在日常工作中使用到的频率不是很高。下面通过例子来具体说明。

分析

我们有一个Shape类,其中含有一个名为draw的虚函数,draw含有一个入参color, 其默认参数为Red。目前我们有两个派生类Rectangle和Circle,其中Rectangle的draw方法的入参设置了color的默认参数为Green, 而Circle的默认参数没有指定参数的默认值。

我们新建了Rectangle和Circle的对象,并使用Shape的指针指向它们,并调用draw方法,并且不指定参数,那么color值将会是多少呢?

#include <iostream>
class Shape
{
public:
	enum ShapeColor { Red, Green, Blue };

	// All shapes must offer a function to draw themselves.
	virtual void draw(ShapeColor color = Red) const = 0;
};


class Rectangle : public Shape
{
public:
	// Notice the different default parameter value = bad!
	virtual void draw(ShapeColor color = Green) const
	{
        std::cout << "color is " << color << std::endl;
	}
};


class Circle : public Shape
{
public:
	virtual void draw(ShapeColor color) const
	{
        std::cout << "color is " << color << std::endl;        
	}
};

int main()
{
	Shape* pr = new Rectangle;	// static type = Shape*		dynaminc type = Rectangle*
	Shape* pc = new Circle;		// static type = Shape*		dynaminc type = Circle*

    pr->draw();
	pc->draw();

	delete pc;
	delete pr;

	return 0;
}

结果:

color is 0
color is 0

have a tryopen in new window

通过结果,我们发现不传递参数进入draw方法时,其参数的默认值将使用基类中所定义入参的默认值,也就是说缺省参数的默认值都是静态绑定的。

总结

  • 绝对不要重新定义一个继承而来的缺省参数值, 因为缺省参数值都是静态绑定, 而virtual函数-你唯一应该覆写的东西-确是动态绑定。
Loading...