虚函数

  • 在类的定义中,virtual关键字的成员函数就是虚函数

    1. class base {
    2. virtual int get();
    3. };
    4. int base::get() {}
  • virtual关键字只用于类定义中的函数声明中,写函数体的时候不用

  • 构造函数和静态成员函数不能是虚函数

    多态表现形式一

  • 派生类的指针可以赋值给基类指针

  • 通过基类指针调用基类和派生类中的同名虚函数时:
    1. 若该指针指向一个基类对象,那么被调用的是基类的虚函数
    2. 若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数

这种机制叫做“多态”

  1. class CBase {
  2. public:
  3. virtual void vFunction() {}
  4. };
  5. class CDerived : public CBase {
  6. public:
  7. virtual void vFunction() {}
  8. };
  9. main() {
  10. CDerived od;
  11. CBase * p = & od;
  12. p->vFunction(); // 调用哪个虚函数取决于p指向的对象类型
  13. }

多态表现形式二

  • 派生类的对象可以赋值给基类的引用
  • 通过基类引用调用基类和派生类中的同名虚函数时:
    1. 若该引用引用的是一个基类对象,那么被调用的是基类的虚函数
    2. 若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数

这种机制叫也做“多态”

  1. class CBase {
  2. public:
  3. virtual void vFunction() {}
  4. };
  5. class CDerived : public CBase {
  6. public:
  7. virtual void vFunction() {}
  8. };
  9. main() {
  10. CDerived od;
  11. CBase & r = od;
  12. r.vFunction(); // 调用哪个虚函数取决于r引用的对象类型
  13. }

多态的示例

image.pngimage.png
image.png