Professional C++读书笔记06

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方法实现的指针。通过这种方式,在一个对象上调用方法时,指针就进了虚表,并基于对象的类型执行该方法的正确版本,而不是根据静态类型来调用。

如下图所示:

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