使用平台:vs2013
动态多态
动态绑定:在程序执行期间,判断所引用对象的实际类型,根据实际的类型调用相应的方法。
动态绑定的条件:
1. 必须是虚函数;
2. 通过基类类型的引用或者指针来调用虚函数。
对于有虚函数的类,编译器都会维护一张表,对象的前四个字节就是指向虚表的指针。
重写(覆盖):
- 不再同一作用域(分别在基类和派生类);
- 函数名相同,参数列表相同,返回值相同(协变和析构函数类外);
- 基类函数必须有Virtual关键字(子类最好写上);
-
访问修饰符可以不同。
协变:返回值可以不同,必须是特殊情况(返回值必须构成基类或者派生类的指针)。
析构:基类析构函数加上Virtual构成重写。
总结:
- 在基类中定义了虚函数,在派生类中该函数始终保持虚函数特性;
- 只有类的非静态成员函数才能定义为虚函数;
- 如果在类外定义虚函数,只能在声明函数时加Virtual,定义时不能加;
- 构造函数不能定义为虚函数(对象还没有定义出来);
- 不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的形为;
- 最好将基类的析构函数定义为虚函数(构成重写);
- 虚表是所有类对象实例共有的。