多态概念
- c++支持编译时多态(静态多态)和运行时多态(动态多态)
- 运算符重载和函数重载是编译时多态,派生类和虚函数是运行时多态。
- 静态多态和动态多态的区别是:函数地址是早绑定,编译阶段确定(静态联编)函数晚绑定,运行阶段确定(动态联编)。
- 基类指针、引用只能访问子类对象中的基类部分。
- 使用基类指针、引用访问子类对象中的成员方法(虚函数),使用virtual修饰成员函数。
指针和引用类型的兼容性
- 指向基类的引用或指针可以引用派生类对象,不必进行强制类型转换。
- 将派生类引用或指针转换为基类引用或指针称为向上强制转换。
BrassPlus dilly ("Annie Dill", 493222, 2000); /子类
Brass * pb = &dilly;
Brass & rb = dilly;
- 将基类引用或指针转换为派生类指针或引用称为向下强制转换,必须使用显式转换,此时不安全。
Brass b;
BrassPlus * p = (BrassPlus *)&b;
- 对于使用基类引用或指针作为参数的函数调用,进行向上转换。
void fr(Brass & rb);
void fp(Brass * pb);
void fv(Brass b);
int main()
{
Brass b("Billy Bee", 123432, 10000.0);
BrassPlus bp("Betty Beep", 232313, 12345.0);
隐式向上强制转换需要动态联编
fr(b);
fr(bp);
fp(b);
fp(bp);
按值传递只将BrassPlus中的Brass部分传递给函数fv。
fv(b);
fv(bp);
...
}
- 编译器对非虚函数使用静态联编,效率高。
- 编译器对虚方法使用动态联编,效率低,所以将那些在派生类中预期被重新定义的方法声明为虚的。