日志22

多态性的知识点

一、多态性的概念

多态性是面向对象编程中的一个核心概念,它允许我们以统一的方式处理不同类型的对象。在C++中,多态性主要通过虚函数来实现,它提高了代码的可维护性、可扩展性和灵活性。

多态性的定义

多态性(Polymorphism)字面意思是“多种形态”,在面向对象编程中,它指的是同一操作作用于不同的对象可以有不同的表现形式。多态性允许我们编写更加通用和可扩展的代码,因为我们可以使用基类指针或引用来操作派生类对象,并在运行时确定实际调用的函数。

多态性的类型

1.静态多态性:也称为编译时多态性,主要通过函数重载和运算符重载来实现。函数重载是指在同一个作用域内,可以有多个函数具有相同的函数名,但参数列表不同。编译器根据函数调用时的参数类型和数量来决定调用哪个函数。运算符重载是指可以为已有的运算符赋予新的含义,使其能够用于特定的类类型。

2.动态多态性:也称为运行时多态性,主要通过虚函数来实现。虚函数是在基类中声明为virtual的函数,在派生类中可以重新定义。当使用指向子类对象的基类指针或引用调用虚函数时,实际调用的是派生类中重新定义的函数,而不是基类中的函数。这是因为在运行时,根据对象的实际类型来确定调用哪个函数。

多态性的好处

1.代码更加模块化和可维护:通过使用统一的接口来处理不同类型的对象,我们可以减少代码的重复,提高代码的可读性和可维护性。

2.代码更容易扩展:当需要添加新的功能或类型时,我们可以通过继承和重写虚函数来实现,而不需要修改现有的代码。

3.代码更加灵活:通过使用虚函数和动态绑定,我们可以在运行时根据对象的实际类型来选择调用哪个函数。这使得我们可以根据不同的情况动态地改变程序的行为。

二、虚函数

虚函数是C++中实现动态多态性的关键。它允许程序在运行时动态地确定调用的函数。

  1. 虚函数的定义虚函数是在基类中声明为virtual的函数,它可以在派生类中被重新定义。当使用基类指针或引用调用虚函数时,实际调用的是派生类中重新定义的函数。
  2. 虚函数的使用在基类中声明虚函数:在基类中,使用virtual关键字声明一个虚函数。在派生类中重写虚函数:在派生类中,使用相同的函数名和参数列表来重写基类中的虚函数。可以使用override关键字来显式指示派生类中的函数是覆盖基类中的虚函数。通过基类指针或引用调用虚函数:当使用基类指针或引用来指向派生类对象时,调用虚函数将实际调用派生类中重写的函数。
  3. 虚函数表(vtable)当一个类中有虚函数时,编译器会为该类创建一个虚函数表(vtable)。这个表存储了指向类中所有虚函数的指针。每个对象都会有一个指向虚函数表的指针(vptr),这样当通过基类指针或引用调用虚函数时,程序可以通过vptr找到正确的函数实现。
  4. 虚函数的限制构造函数和析构函数不能是虚函数。构造函数在对象创建时被调用,此时虚函数表还没有完全构建,因此构造函数不能是虚函数。同样地,析构函数也不应该是虚函数,除非基类析构函数被声明为虚函数,以确保在删除派生类对象时能够正确调用派生类的析构函数。虚函数会引入一些额外的开销,因为程序需要在运行时通过虚函数表来查找并调用正确的函数。因此,在不需要多态性的情况下,应避免使用虚函数。

三、纯虚函数

纯虚函数是一种特殊的虚函数,它在基类中被声明,但没有具体的实现。纯虚函数的主要作用是作为一个接口,强制要求从该基类派生的任何子类都必须实现这个函数。

纯虚函数的定义

纯虚函数在基类中被声明为virtual,并且函数体为空,通常被赋值为0(即=0)。例如:

virtual void functionName() = 0;

纯虚函数的作用

1.定义接口:纯虚函数提供了一种方式,允许基类定义一个接口,要求所有派生类都必须实现这个接口。

2.强制派生类实现:如果一个类被设计为基类,并希望派生类提供某些特定功能的具体实现,则可以将这些功能声明为纯虚函数。

3.禁止直接实例化:包含纯虚函数的类不能直接实例化对象,这有助于避免误用,因为抽象类通常仅用作其他类的基类。

抽象类

如果一个类至少含有一个纯虚函数,那么这个类就被称为抽象类(Abstract Class)。抽象类不能被实例化,即不能创建该类的对象,但可以被用作基类来创建派生类的对象。

纯虚函数的使用

1.在基类中声明纯虚函数,以定义派生类必须实现的接口。

2.在派生类中实现纯虚函数,以提供具体的功能实现。

3.使用基类指针或引用来操作派生类对象,并通过基类指针或引用调用纯虚函数(实际上是调用派生类中的实现)。

四、多级继承

多级继承是C++面向对象编程中的一个重要特性,它允许从已有的类派生出新的类,并且新的类还可以继续作为基类派生出更多的类。

多级继承的定义

多级继承是指在C++编程中,不仅可以从基类派生一个类,还可以从派生类派生出一个新的类。这种继承形式被称为多级继承。

多级继承的使用

1.定义基类:首先定义一个基类,它包含了一些基本的属性和方法。

2.定义派生类:从基类派生出一个或多个派生类,这些派生类继承了基类的属性和方法,并可以添加新的属性和方法或重写基类中的方法。

3.定义多级派生类:从派生类继续派生出新的类,这些新的类继承了派生类的属性和方法,并可以进一步添加新的属性和方法或重写派生类中的方法。

多级继承中的构造函数和析构函数

1.在多级继承中,构造函数的调用顺序是从基类到派生类,再到多级派生类。析构函数的调用顺序则相反,从多级派生类到派生类,再到基类。

2.在派生类的构造函数中,需要显式调用基类的构造函数来初始化基类的成员变量。同样地,在多级派生类的构造函数中,需要显式调用派生类的构造函数来初始化派生类的成员变量。

3.析构函数不需要显式调用,因为当对象被销毁时,系统会自动调用析构函数,并按照从内到外的顺序依次销毁对象。

多级继承中的虚函数和纯虚函数

1.在多级继承中,虚函数和纯虚函数的使用与在单级继承中类似。基类中的虚函数或纯虚函数可以在派生类中被重写,也可以在多级派生类中被进一步重写。

2.通过使用虚函数和动态绑定,我们可以在运行时根据对象的实际类型来选择调用哪个函数。这使得我们可以根据不同的情况动态地改变程序的行为。

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务