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)


  • 结果将出乎意料。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《Effective C++ 》学习笔记-第六章 条款37:绝不重新定义继承而来的缺省参数值

Never redefine a function's inherited default parameter value

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

重新定义一个继承而来的non-virtual函数永远都是错误的,本条款的讨论限制在“带有缺省参数的virtual函数”。 virtual函数是动态绑定的,而缺省参数却是静态绑定。对象的所谓静态类型,...

关于C++虚函数默认参数的问题。Effective C++ 条款38: 决不要重新定义继承而来的缺省参数值

昨晚在chgaowei的博客上关于讨论C++虚函数的默认参数问题,刚翻书找了一下,在Effective C++ 中的38条有说明。直接上原文吧,最后加几句细点的理解条款38: 决不要重新定义继承而来的...

《Effective C++》读书笔记之item37:绝不重新定义继承而来的缺省参数值

1.绝不重新定义继承而来的缺省参数值,它有两层意思: (1)如果函数是非虚函数,你根本不应该重新定义它,因此也谈不上改变缺省参数值了。(2)如果函数是虚函数,由于缺省参数值是“静态绑定”,即使使...

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

考虑下面这段程序: #include using namespace std; class Shape { public: enum ShapeColor { Red, Green, B...

C++之绝不重新定义继承而来的缺省参数值(37)---《Effective C++》

条款37:绝不重新定义继承而来的缺省参数值首先让我们进行分析,类的继承中只能继承两种函数,virtual和non-virtual,然鹅重新定义一个继承而来的non-virtual函数永远是错误的,所以...

条款38: 决不要重新定义继承而来的缺省参数值(有味道的一条)

让我们从一开始就把问题简化。缺省参数只能作为函数的一部分而存在;另外,只有两种函数可以继承:虚函数和非虚函数。因此,重定义缺省参数值的唯一方法是重定义一个继承而来的函数。然而,重定义继承而来的非虚函数...

绝不重新定义继承而来的缺省参数——effective c++学习笔记

绝不重新定义继承而来的缺省参数(Never redefine function’s inherited default parameters value.) 讨论的前提是:不重新定义继承而来的no-...

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

先上代码: class Base { public: virtual int getVal(int i = 0) { cout<<"基类函数"<<endl; return i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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