C++的多态性和虚函数

1.作为新手学习C++的多态性,首先应该了解C++的多态性有何现实意义?

   多态性的现实意义在于可以用相同的函数名来标识这些函数,达到用同样的接口访问不同功能的函数,从而实现“一个接口,多种方法”。通俗点说就是可以不用像C语言中为了求多种图形的面积而针对不同的图形各设计了一个名字独立的函数,在C++中只要设计一个专门用于求面积的函数名字即可,这个专门用于求面积的函数名字可以作为求各种图形面积的函数的名字。这么做的好处在于程序设计者可以省去设立多个函数名字对应多个函数的麻烦,使用的时候统一用一个函数名字就可调用具有不同功能的同名函数。

2.多态性的定义是什么?

   指向不同的对象发生同一个消息,不同的对象在接收时会产生不同的行为就是多态性。而多态性的实现其实和函数重载有着很紧密的关系。

3.为什么说函数重载和多态性有着很紧密的关系?

   首先函数重载通俗点说指的是定义多个名字相同的函数,这些函数在C语言中是非法的,但在C++中的合法的。下面介绍3种体现多态性的方法。

   (1)类外普通函数的重载可以体现多态性(参数一定要不同):

C++的多态性和虚函数_第1张图片

(2)不含继承关系的类之间定义同名函数可以体现多态性(参数可以相同):

C++的多态性和虚函数_第2张图片

(3)派生类中重载基类定义的同名函数体现的多态性(参数可以相同):

C++的多态性和虚函数_第3张图片

由上述3个体现多态性的方法中可得出:3种方法其实本质都是函数的重载,只不过第一种方法局限于传入的参数必须不相同,因为如果在使用第一种方法时传入的参数都相同,则会产生二义性,系统无法分清我们到底想调用哪个函数。而第二、第三种方法其实很相似,它们相似的地方在于传入的参数可以相同,而且都是依靠在某个类中定义这些同名函数,这里因为有了不同的类作为前提,所以即使函数名字相同,传入参数相同,系统仍然可以分清我们到底要调用哪个函数,表现出了多态性。虽说第二、第三种方法相似,但个方法之间却有着本质区别:第二种方法是因为在不同类中定义这些同名函数而合法的;第三种方法则是因为派生类重载基类成员函数而合法的,派生类原本就继承了基类的所有成员,派生类再一次定义这些同名函数其实是重载基类的成员函数。

由此可以得出结论:多态性的表现方式是通过函数重载,只不过函数重载在不同时候有不同的令其合法化的规则。

4.虚函数的定义是什么?

    虚函数是一种动态的重载方式。它提供了一种更为灵活的运行时的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。

5.虚函数有什么作用?

   假设基类中定义了一个同名函数,其派生类中重载了这个同名函数,那么再定义一个基类的对象指针,把派生类对象的地址赋给这个基类的对象指针,则通过这个基类对象指针调用那个同名函数时,实际调用的其实是基类定义的同名函数,而不是派生类重载后的同名函数。这就明显没有达到程序设计者的要求。如何才能令基类的对象指针指向派生类对象后还可以调用派生类中重载后的同名函数呢?

   这就要引入虚函数了,虚函数可以达到令基类的对象指针指向派生类对象后还可以调用派生类中重载后的同名函数这一目的。C++的多态性和虚函数_第4张图片

C++的多态性和虚函数_第5张图片

6.纯虚函数的定义是什么?

   基类往往表示一种抽象的概念,它并不与具体的事物相联系。这时在基类中将某一成员函数定义为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要定义。而预留的这个函数名就是纯虚函数。

7.纯虚函数的作用是什么?

   在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义。

8.使用纯虚函数时需要注意什么?

   (1)纯虚函数没有函数体,它最后面的“=0”并不表示函数的返回值为0,它只起形式上的作用,告诉编译系统“这是虚函数”。

   (2)纯虚函数不具备函数的功能,不能被调用,不能在基类中对纯虚函数的实现进行定义。

C++的多态性和虚函数_第6张图片

9.抽象类的定义是什么?

   如果一个类至少含有一个纯虚函数,那么就称该类为抽象类。

10.抽象类的使用有哪些规定?

   (1)由于抽象类中至少包含一个没有定义功能的纯虚函数。因此抽象类只能作为它类的基类来使用,不能建立抽象类对象。

   (2)不允许从具体类中派生出抽象类,即不能在派生类中定义纯虚函数。

   (3)抽象类不能用作函数的参数类型、函数的返回类型或显式转换的类型。

   (4)可以声明指向抽象类的指针或引用,此指针可以指向它的派生类,进而实现多态性。

   (5)如果派生类中没有定义纯虚函数的实现,而派生类只是继承基类的纯虚函数,则这个派生类仍然是一个抽象类。如果派生类        中给出了基类纯虚函数的实现,则该派生类不再是抽象类,而是一个可以建立对象的具体类了。

11.虚函数和纯虚函数有什么区别?

     在基类中声明了虚函数,可以对其的实现进行定义;而在基类中定义了纯虚函数,不可以对其的实现进行定义。

你可能感兴趣的:(C++新手入门日记)