effective C++ 读书笔记 条款36-37
来源:互联网 发布:程序员如何保护颈椎 编辑:程序博客网 时间:2024/04/27 20:36
条款36:绝不重新定义继承而来的non-virtual函数
重要点:non-virtual函数都是静态绑定
// 1241.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;class Base{public:void func(){cout<<"Base::func()"<<endl;}};class Derived : public Base{public:void func(){cout<<"Derived::func()"<<endl;}};int _tmain(int argc, _TCHAR* argv[]){Derived test;Base* pB = &test;Derived* pD = &test;pB->func();//调用Base::func()pD->func();//调用Derived::func()/*这里我们讨论的不是关于隐藏的问题;上面pB指向一个子类,但是调用的是父类的func()函数,至于为什么,因为不是虚函数,没有virtual;要明白一点:non-virtual函数 Base::func and Derived::func都是静态绑定的,pB被声明为一个人 pointer-to-Base,通过pB调用的non-virtual函数永远是Base所定义的版本,即使pB指向一个类型为它的派生类的对象。pD 调用的是Derived的函数版本,这里也可以说成是隐藏,但是最终原因是因为 静态绑定。一般 Derived dTest,dTest.func()这样调用我们一般说是因为隐藏。对于对象,而我们本例子当中对应的是指针或者引用,是因为静态绑定!*/getchar();return 0;}
总上:任何情况下都不应该重新定义一个继承而来的non-virtual函数;
对于一个基类来说,如果一个函数定义为非虚函数,那么意味着这个函数并不想改变,所以子类不应该继承它,一个类当中的非虚函数,不变性凌驾于其特异性上。
条款37:绝不重新定义继承而来的缺省参数值:
virtual函数是动态绑定,缺省参数值是静态绑定;
// 1240.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;class Shape{public:enum ShapeColor{Red,Green,Blue};virtual void draw(ShapeColor color = Red) const = 0;};class Rectangle:public Shape{public:virtual void draw(ShapeColor color = Green) const{cout<<"Rectangle"<<endl;}};class Circle : public Shape{public:virtual void draw(ShapeColor color) const{cout<<"Circle"<<endl;}};int _tmain(int argc, _TCHAR* argv[]){Shape* ps;Shape* pc = new Circle;Shape* pr = new Rectangle;pr->draw();//这里调用的是Rectangle的draw函数,但是函数参数color却是Shape父类里面的参数/*virtual函数是动态绑定,而缺省参数值却是静态绑定。这就出现了上面的 调用一个定义于子类的virtual函数,同时却使用base class为它所指定的缺省参数值。pr的动态类型是Rectangle*,所以调用的是Ractangle的virtual函数,但是由于pr的静态类型是Shape*,所以此函数调用的缺省参数值却是来自鱼Shape Class.*/getchar();return 0;}
总结:不要重新定义一个继承而来的缺省参数值,因为缺省参数值是静态绑定的,而virtual函数--你唯一应该覆写的东西--却是动态绑定!!
2 0
- 《Effective C++》:条款36-条款37
- 【Effective C++】读书笔记 条款13~条款17
- effective C++ 读书笔记 条款36-37
- 【Effection C++】读书笔记 条款36~条款37
- 【Effective C++】读书笔记 条款49~51
- Effective C++读书笔记01条款37
- 读书笔记《Effective C++》条款37:绝不重新定义继承而来的缺省参数值
- 读书笔记《Effective C++》条款36:绝不重新定义继承而来的non-virtual函数
- 读书笔记: effective C++; 条款22 和 23, 尽量用传址少用传值。
- 读书笔记《Effective C++》条款03:尽可能使用const
- 读书笔记《Effective C++》条款13:以对象管理资源
- 读书笔记《Effective C++》条款19:设计class犹如设计type
- 读书笔记《Effective C++》条款27:尽量少做转型动作
- 读书笔记《Effective C++》条款30:透彻了解inlining的里里外外
- 读书笔记《Effective C++》条款42:了解typename的双重意义
- Effective C++ 读书笔记 条款一至三
- Effective C++ 读书笔记 条款01
- effective C++ 读书笔记 条款20
- C++中的容器
- iphone6 Images.xcassets
- 第15周项目3-(2)
- 4G时代,Wi-Fi还有未来吗?
- 表单基础3
- effective C++ 读书笔记 条款36-37
- 【android】利用getViewTreeObserver().addOnGlobalLayoutListener()获得一个视图的高度
- alsa与PulseAudio
- cloudera的各种默认数据库 hive mysql
- 第十五周项目三
- 第十五周项目一 单步调试指针
- OJ平台项目一
- 第十五周项目三——在OJ上玩指针(2)
- Sed实例