effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值

原创 2012年03月26日 11:34:44

  • 先看如下类层次结构

enum ShapeColor {RED, GREEN, BLUE};
class Shape
{
public:
         virtual void draw(ShapeColor color = RED) const = 0;
         …
};
class Rectangle : public Shape
{
public:
         virtual void draw(ShapeColor color = GREEN) const;   //重新定义了缺省参数
         …
};
class Circle : public Shape
{
public:
         virtual void draw(ShapeColor color) const;
         …
};
Shape *ps;
Shape *pc = new Circle;
Shape *pr = new Rectangle;

  • 对象的静态类型指你声明的存在于程序代码文本中的类型。ps,pc和pr都被声明为Shape指针类型,所以它们都以此作为自己的静态类型。注意,这和它们真的所指向的对象的类型绝对没有关系---他们的静态类型总是Shape *。
  • 对象的动态类型是由它由它当前所指向的对象的类型决定的。即,对象的动态类型表示它将执行何种行为。pc的动态类型是Circle *,pr的动态类型是Rectangle *。至于ps,实际上没有动态类型,因为它还没有指向任何对象。
  •  动态类型可以在程序运行时改变,通过赋值。
  • 虚函数是动态绑定的,虚函数通过哪个对象被调用,具体被调用的函数就由那个对象的动态类型决定。
  • 非虚函数是静态绑定的。
  • 虚函数是动态绑定的,但缺省参数是静态绑定的。这意味着你最终可能调用的是一个定义在派生类,但使用了基类中的缺省参数值的虚函数。如下所示:
  • pr->draw();//将调用Rectangle::draw(RED)


  • 结果将出乎意料。

条款36、绝不重新定义继承而来的缺省参数值

为简化问题,只能定义两种函数:虚函数和非虚函数。从前面我们知道,重定义继承而来的非虚函数永远是错误的。所以我们讨论“继承一个带有缺省参数值的虚函数”。 理由十分明确:1、虚函数系动态绑定(又称前期绑...
  • lsfreeing
  • lsfreeing
  • 2015年03月17日 10:43
  • 363

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

总结: 不要重新定义一个继承而来的缺省参数值,因为缺省参数值是静态绑定,而virtual函数(你唯一应该覆写的东西)是动态绑定。 我们应该知道,virtual函数是动态绑定(dynam...
  • u013074465
  • u013074465
  • 2015年07月26日 11:21
  • 708

绝不要重新定义继承而来的缺省参数值(Effective C++_37)

一、考虑以下代码 代码来源:http://blog.csdn.net/cadcisdhht/article/details/6233170class A { public: virtual v...
  • zhangchen1003
  • zhangchen1003
  • 2015年09月15日 15:37
  • 182

C++ 绝不要重新定义继承而来的缺省参数值

原因:虚函数是动态绑定的,但缺省参数是静态绑定的。这意味着你最终可能调用的是一个定义在派生类,但使用基类中的缺省参数值的虚函数。...
  • dongyu_1989
  • dongyu_1989
  • 2018年02月10日 09:49
  • 17

不要重新定义继承而来的缺省参数值

–effective c++ item 37首先,简化一下问题.你只能继承两种函数:virtual 和 non-virtual 函数 .而重新定义一个继承而来的non-virtual函数永远是错误的....
  • sinat_37806635
  • sinat_37806635
  • 2017年07月21日 14:46
  • 170

为什么说c++不能重定义继承而来的默认参数

目前有许多文章都会详细介绍c++虚函数实现,博主在此稍微点题,简单说明下单一继承下的c++虚函数实现机制。class Base { public: virtual void fun() ...
  • qq_36079797
  • qq_36079797
  • 2016年10月16日 10:50
  • 172

effective c++ 条款38: 决不要重新定义继承而来的缺省参数值

条款38: 决不要重新定义继承而来的缺省参数值  条款38: 决不要重新定义继承而来的缺省参数值 让我们从一开始就把问题简化。缺省参数只能作为函数的一部分而存在;另外,只有两种函数可以继承:虚函...
  • fengxinziyang
  • fengxinziyang
  • 2010年09月24日 15:14
  • 324

绝对不要重新定义继承而来的non-virtual函数(Effective C++_36)

一、对于非虚函数同一个对象调用同一个函数,可能产生了不同的行为class B{ public: void mf(){ cout...
  • zhangchen1003
  • zhangchen1003
  • 2015年09月15日 10:41
  • 280

Effective Modern C++ 条款38 意识到线程句柄的析构函数的不同行为

Effective Modern C++ 条款38
  • big_yellow_duck
  • big_yellow_duck
  • 2016年09月14日 23:55
  • 1151

Effective C++:绝不重新定义继承而来的缺省参数值

考虑下面这段程序: #include using namespace std; class Shape { public: enum ShapeColor { Red, Green, B...
  • optcaelum
  • optcaelum
  • 2016年07月16日 16:20
  • 201
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值
举报原因:
原因补充:

(最多只允许输入30个字)