本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次而来的缺省參数值.由于缺省參数值都是静态绑定,而 virtual 函数 -- 你唯一应该覆写的东西 -- 却是动态绑定 演示样例: class Shape{ public: enum ShapeColor {Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; }; class R…
virtual 函数会动态绑定,而virtual函数的缺省參数值是静态绑定的. 用一个base类型的指针p去指向一个derived类对象.通过p调用虚函数时,会动态绑定到实际所指对象中的函数:用一个derived类型的指针p2指向一个derived对象,由p2调用函数时,直接就是调用的derived中的函数.其參数值也是derived类中函数相应的參数值. #include <iostream> using namespace std; class A { public: enum Color…
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定的,而缺省參数却是静态绑定. 对象的所谓静态类型,是它在程序中被声明时所採用的类型. 你可能会在"调用一个定义于derived class 内的virtual函数"的同一时候,却使用了base class为它所指定的缺省參数值. (二) 为什么继承而来的virtual函数的缺省參数值不能被…
引子: 阿里的一道题: #include <IOSTREAM> using namespace std; class A{ public: ) { cout<<"a~"<<val<<endl; } virtual void test() { func(); } }; class B: public A{ public: ) { cout<<"b~"<<val<<endl; } };…
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例 演示样例: class B{ public: void mf(); //... }; class D: public B{ public: void mf(); // 遮掩了B::mf.Item 33 名称遮掩规则 } D x…
NOTE: 1.绝不重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual 函数-----你唯一应该覆盖的东西----却是动态绑定的.…
条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现宏的可爱之处...咔咔. 条款2:尽量用而不用 iostream的 IO智能,灵活,类型安全.呃,效率要比 stdio的IO低些. 条款3:尽量用new和delete而不用malloc和free new/delete是转为C++设计的---它会自动调用构造析构函数. 恩,这也会造成不必要的性能损失.…
这几天在看effective C++3rd,这本书算是比较经典的一本入门C++的书了.虽然年代比较久远书中讲的好多模式已经被的新特性取代了,但是从这些旧的模式中可以了解到一些C++新特性设计的初衷,也算是窥探到了C++发展的一角吧. 所以在此记录一下学习过程中那些被C++11新特性取代的旧模式吧(C++11后面的特性我还不是很了解,以后学到了再补充吧) 1.阻止编译器自动生成函数 编译器在一些情况下会为自定义类自动生成默认构造函数.拷贝构造函数和运算符,移动构造函数和运算符(C++11新特性).…
先看下面的例子: enum MyColor { RED, GREEN, BLUE, }; class Shape { public: ; }; class Rectangle: public Shape { public: void Draw(MyColor color = GREEN) const { cout << "default color = " << color << endl; } }; class Triangle : public…
(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计"层面上没有意义. (3)private继承而来的基类成员都会在派生类中成为private属性,纵使它们在base class中原本是protected或public属性: (4)假设类之间是private继承关系.编译器不会自己主动将一个派生类对象转换为基类对象. (5)D类以私有形式继承B类,意…