多态性——虚函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27305031/article/details/54558141
  1. 虚函数是重载的另一种表现形式,是一种动态的重载方式。虚函数调用与函数体之间的联系在运行时才建立。
  2. C++中可以用基类的对象指针可以指向它的公有派生对象,当它指向公有派生类对象时,只能访问派生类中从基类继承来的成员,而不能访问派生类中定义的成员。
  3. 当指针指向不同的对象时,分别调用不同类的成员函数,如果将函数说明为虚函数,就能够实现这种动态调用的功能。
  4. 虚函数的定义:允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。虚函数的定义在基类中进行,它是基类中需要定义为虚函数的成员函数的声明中冠以virtual.在派生类中重新定义时,必须具有相同的函数原型,包括函数类型,函数名,参数个数,参数类型顺序。
  5. 说明:
    (1)若在基类中,只声明虚函数原型,而在类外定义时不需要再加virtual.
    (2)虚函数重新定义时,其函数的原型与基类中的函数原型都必须相同。
    (3)当一个成员函数定义为虚函数后,其派生类中符合重定义虚函数要求的同名函数都自动成为虚函数,故在派生类中重新定义该虚函数是,关键字virtual可以写或者不写。
    (4)如果在派生类中没有对基类的虚函数的重新定义,则公有派生类直接继承基类的虚函数。
    (5)虚函数必须是所在的成员函数,不能是友元函数,也不能是静态成员函数,因为虚函数调用要依靠特定的对象来决定该激活那个函数。
    (6)虽然使用对象名和点运算也可以调用虚函数,但是这种调用在编译时进行,是静态联编,没有利用虚函数的定义。

  6. 虚析构函数:先调用派生类的析构函数,再调用基类的析构函数virtual ~类名();虽然派生类的析构函数与基类的析构函数名字不相同,但是如果将基类的析构函数定义为虚函数,由该基类所派生的所有派生类的析构函数都自动成为虚函数。

  7. 虚函数和重载函数的区别:函数重载是,参数或者参数的类型必须有所不同,函数的返回值也可以不同,但是重载一个虚函数时,在派生类重新定义虚函数时,要求函数名,返回类型,参数个数,参数类型和顺序与基类的虚函数的原型完全相同。
  8. 纯虚函数:在基类中说明的虚函数,它在该基类中没有定义,但要求在他的派生类中根据需要对它进行定义,或仍旧说明为纯虚函数。virtural 函数类型 函数名(参数表)=0;
  9. 纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义。
  10. 如果有一个至少有一个纯虚函数,那么就称这个类为抽象类
    (1)抽象类中至少包含一个没有定义功能的纯虚函数,因此抽象类只能作为其他类的基类,不能建立抽象类的对象。
    (2)抽象类不能用作参数类型,函数返回类型或显式转换类型,可以声明指向抽象类的指针变量指针可以指向他的派生类,进而实现多态性
    (3)如果在抽象类的派生类中没有重新说明纯虚函数,则函数在派生类中仍然为纯虚函数,而这个派生类仍旧是一个抽象类

猜你喜欢

转载自blog.csdn.net/qq_27305031/article/details/54558141