2012-05-22
Chapter09
1、操作符重载:实现类对象按简单类型进行+-
例:SpreadsheetCell myCell(4),anotherCell(5);
SpreadsheetCell aThirdCell=myClee+anotherCell;
const SpreadsheetCell operator+ (const SpreadsheetCell &cell)const;
可以实现aThirdCell=myCell+5.6这样的操作
解释:编译器会寻找一个double作参数的SpreadsheetCell的构造函数,并以5.6创建一个临时变量
但,1,诸如myCell+str之类并无实际意义的相加可通过explicit关键字禁止。
explicit放于类定义中,且只适用于仅有一个参数的构造函数
explicit SpreadsheetCell (const string &str); //使用示例
2,若aThirdCell=5.6+myCell;会失败
解决方案:使用全局operator+,并标注友元
2012-05-22
Chapter10
1、函数覆盖:基类中声明virtual,字类与基类方法参数与返回值都一样
经验:将所有方法都用virtual声明(包括析构函数),但不包括构造函数
Base *p=new Derived();
delete p; //若基类不加virtual,析构时只调用了base的析构,而没有调用derived的
2、多态:基类的指针(引用)指向派生类的对象,调用派生类对应的方法(基类要为virtual)
注:但此时基类指针不可调用在基类中未定义的子类方法(即使指向子类)
例:Derived de;
Base &base=de;
de.DericedFunc(); //√
base.DerivedFunc(); //×
若基类未定义DerivedFunc(),则不可这样调用。与多态不矛盾,多台要求基类存在且为virtual
2012-05-27
Chapter10
1、函数隐藏:
其中之一情况:子类方法的参数列表与基类不一样
例如父类为someMethod();
子类为someMethod(int i);
则Derived d; d.someMethod();//出错,父类函数已被隐藏
2、在C++中,不能覆盖static方法
即,若A a;
B &b=a; 则b.fun()调用b类的static方法
(静态联编,只关心对象编译时的类型)
3、在重写子类的复制构造函数时应显式的调用父类的
如Sub::Sub(const Sub &insub):Super(insub){……}
//若不写,调用的是父类的默认构造函数
4、virtual实现机制。
如果声明方法时使用了virtual,则在一块特别内存区域内寻找方法的实现。这块内存区域叫vtable,即虚表。包含一个或多个virtual方法的类都有一个虚表,包含了指向virtual方法实现的指针。通过这种方式,在一个对象上调用方法时,指针就进了虚表,并基于对象的类型执行该方法的正确版本,而不是根据静态类型来调用。
如下图所示: