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;这样的操作