1动态绑定与静态绑定
把B的对象b强转为A类,那么调用的A的虚函数还是B的虚函数? 这是通过对象来调用,不是通过指针来调用,所以是静态绑定,用call +函数地址来调用,调用的是A的虚函数
pa->vfunc1() 符合动态绑定的三个条件 1 用指针调用 2 向上转型(父类指针指向子类对象) 3 是虚函数 call+指针
2const关于cow的应用
const:常量对象不能调用非常量函数,这点前面老师说过好几次,出错的时候很难检查出来。 const也算函数签名的一部分:函数重载的时候不看返回值类型,只看函数签名,即参数数量和类型是否一致,如果都一致就不叫重载,叫重名,会报错,但const也算函数签名的一部分,如果参数数量和类型一致,但是一个有const一个没const,也算重载。
string copy 时是共享一个string,但当其中一个要改的时候,会临时copy一个用来写(即copy on write),所以标准库里string必须考虑cow,那么当常量字符串调用[],比如const str[5],那么就不用考虑cow,所以标准库要把这种情况区分开来,这才有了两个重载[]的函数。这样一来常量对象只能调用常量成员函数,但非常量对象可以调用常量成员函数和非常量成员函数,为了避免这种情况,所以c++还有条规则,就是那条灰色框框。
3重载new delete
::operator new 重载全局的new,风险很大,因为很多其他函数都会用到
根据原来讲的new和delete需要分成三步和两步,下面例子说明了就算重载了new和delete,前面的步骤没变。
4重载new[]和delete[]
蓝色框里如果无成员函数重载的new和delete则调用全局的new和delete,若有则用成员函数重载的new和delete,若调用::new则是强制调用全局的
每个元素为4(int)+4(long)+4(string)=12个字节,数组元素为5,那么sizeof(Foo)=12x5=60,为什么是64呢,因为分配内存的时候多出了一个大小为4字节记录数组元素个数的内存,如果是虚函数那么就多了根虚指针,每个元素就是16个字节,sizeof()后就是16x5+4=84 ,construct(构造)是从上到下,destruct(析构)是从下到上。
5 不同版本的重载new delete