天天看点

动态多态——虚函数

使用平台:vs2013

动态多态

动态绑定:在程序执行期间,判断所引用对象的实际类型,根据实际的类型调用相应的方法。

动态绑定的条件:

1. 必须是虚函数;

2. 通过基类类型的引用或者指针来调用虚函数。

对于有虚函数的类,编译器都会维护一张表,对象的前四个字节就是指向虚表的指针。

重写(覆盖):

  1. 不再同一作用域(分别在基类和派生类);
  2. 函数名相同,参数列表相同,返回值相同(协变和析构函数类外);
  3. 基类函数必须有Virtual关键字(子类最好写上);
  4. 访问修饰符可以不同。

    协变:返回值可以不同,必须是特殊情况(返回值必须构成基类或者派生类的指针)。

    析构:基类析构函数加上Virtual构成重写。

总结:

  1. 在基类中定义了虚函数,在派生类中该函数始终保持虚函数特性;
  2. 只有类的非静态成员函数才能定义为虚函数;
  3. 如果在类外定义虚函数,只能在声明函数时加Virtual,定义时不能加;
  4. 构造函数不能定义为虚函数(对象还没有定义出来);
  5. 不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的形为;
  6. 最好将基类的析构函数定义为虚函数(构成重写);
  7. 虚表是所有类对象实例共有的。

继续阅读