啥是联编
将源代码中的程序调用解释为执行特定的函数代码块被称为函数名联编
在编译过程中的联编被称为静态联编
在程序运行时的联编被称为静态连编
##指针和引用类型的兼容性
将派生类指针或引用转为基类指针或者引用被称为向上强制转换,如果是共有继承则不需要进行显式类型转换,任何对基类对象做的操作都适合派生类对象.
相反,将基类指针或者引用转换为派生类指针或者引用被称为向下强制转换,需要显示类型转换,但是派生类可以新增成员函数,由于基类没有这些函数,这使得使用新增成员函数的类成员函数不能作用于基类.
现在我们有个虚方法
由于按值传递ship对象的player部分被传递给函数fv().但是引用和指针发生的向上强制转换分别为player对象和ship对象使用了不同的函数(virtual).隐式向上强制类型转换使得基类对象可以指向基类对象或派生类对象,因此需要动态联编.
虚函数和动态联编
概念理解:虚函数工作原理
通常,编译器处理虚函数的原理是:给每个对象添加一个隐藏成员,这个隐藏成员保存了一个指向函数地址数组的指针.它被称为虚函数表,虚函数表保存了类对象的虚函数地址.
列如,基类对象包含一个指针,它指向基类中所有虚函数的地址表.派生类对象将指向一个独立地址表的指针,如果派生类里提供了虚函数的定义,那么这个独立的地址表将会保存新函数的地址,如果没提供,该表将使用原始版本的地址.如果派生类定义了新的虚函数,那么该函数的地址也会被添加到表中.
注意:无论类中有多少个虚函数,都只在对象中添加一个地址成员,只是大小有所差别
虚函数总结:
- 构造函数不能是虚函数;
- 析构函数应该是虚函数(除非不作为基类);
- 友元不能是虚函数,因为友元函数不是类成员;
- 如果基类声明被重载,则应在派生类中重定义所有的基类重载版本;
- 重定义不是重载,如果重定义继承的方法,应该确保与原型完全一致;
注意:如果原返回类型是指向基类的指针或者引用,可以改成指向派生类的指针和引用,这被成为返回类型协变