Effective C++读书笔记04

2012-03-30

1、绝不要重新定义继承而来的缺省参数值(对于virtual)

     class base

     {

     public :virtual void draw(color c=RED)const=0;

     }

     class derived public base

     {

     public :virtual void draw(color c=GREEN)const;

     }

     base *p=new derived;     //p的静态类型为base*,动态类型为derived*

     虚函数满足动态绑定,依据动态类型调用,∴p->draw(RED);                   //没有问题

     但缺省参数是静态绑定,依据静态类型调用,∴p->draw();

     调用的是基类的静态绑定(red),子类的动态绑定,相当于derived::draw(red)

     即,基类子类各起一半作用,并没有调用子类的默认函数,危险

2、template产生一群class,其中对象类型不影响class的行为

     inheritance产生一群class,其中对象类型会影响class的行为

     比如,对于birds,不同的class的run,fly行为不同,用inheritance

     对于stack,不同类型的class,其push,pop相同,用template

3、如果私有继承,编译器不会自动把一个子类对象转换为一个基类对象,这与公有继承相反

     且由私有继承过来的所有成员,在子类中都会变成private类型

4若类中什么都不写,编译器会自动生成一个默认构造函数,一个复制构造函数,一个析构函数,一个赋值运算符,一个取址运算符

     取址运算符解释:

     对于time类,则会有

     Time * operator&(){return this;}

     const Time * operator&()cosnt{return this;}

     对应于 Time *p=&p1;这样的操作

原文地址:https://www.cnblogs.com/yangtianxing/p/2433017.html