Explicación detallada de las funciones virtuales de C++: principios del polimorfismo y su aplicación en la programación orientada a objetos

El polimorfismo es un concepto muy importante en la programación orientada a objetos. El polimorfismo significa que el mismo objeto puede comportarse de manera diferente cuando se usa en diferentes contextos. C++ es un lenguaje de programación orientado a objetos. En C++, las funciones virtuales son la clave del polimorfismo.

¿Qué es una función virtual?

Una función virtual es una función declarada en una clase base que las subclases pueden anular y proporcionar una implementación diferente. En C++, las palabras clave se utilizan virtualpara declarar una función virtual. El principio de las funciones virtuales es dar el control de las llamadas de función al entorno de tiempo de ejecución, no al entorno de tiempo de compilación. Por lo tanto, la implementación de funciones virtuales debe determinarse en tiempo de ejecución. La forma de declaración de una función virtual es la siguiente:

 virtual 返回类型 函数名(参数列表) {
   // 实现代码
 }
复制代码

Por ejemplo:

 class Shape {
   public:
     virtual void draw() {
       // 实现代码
     }
 };
 
 class Circle : public Shape {
   public:
     void draw() override {
       // 实现代码
     }
 };
复制代码

En el ejemplo anterior, Shapela clase define una función virtual draw()y Circlese anula en la clase. Tenga en cuenta que la palabra clave Circlese usa en la función anulada en la clase override, que es una característica nueva introducida en C++ 11, lo que indica que la función es una función anulada del mismo nombre en la clase base.

Implementación de polimorfismo

Al usar un puntero de clase base o una referencia para acceder a un objeto de clase derivada, si la función virtual se anuló, se llamará a la implementación en la clase derivada. Este comportamiento se denomina polimorfismo en tiempo de ejecución porque la función real a llamar se determina en tiempo de ejecución. Por ejemplo:

 Shape* s = new Circle();
 s->draw(); // 调用Circle类中的draw()函数
复制代码

En el ejemplo anterior, usamos el puntero de clase base spara acceder Circleal objeto de la clase, porque Circlela clase anula la función, por lo que la implementación en la clase draw()se llama . CircleEste comportamiento puede hacer que el código sea más flexible, extensible y fácil de mantener. Hay dos formas de lograr polimorfismo: polimorfismo estático y polimorfismo dinámico. El polimorfismo estático se logra mediante la sobrecarga de funciones, mientras que el polimorfismo dinámico se logra mediante funciones virtuales.

El polimorfismo estático es para determinar la llamada de una función en tiempo de compilación, y la sobrecarga de funciones es una forma de polimorfismo estático. Por ejemplo:

 void print(int a) {
   // 实现代码
 }
 
 void print(float b) {
   // 实现代码
 }
复制代码

En el ejemplo anterior, definimos dos funciones print(), una que toma un argumento entero y la otra que toma un argumento flotante. Al llamar print()a una función, el compilador determina qué función llamar según el tipo de argumentos pasados.

动态多态是在运行时确定函数的调用。虚函数是动态多态的一种形式。在使用虚函数时,可以将基类指针或引用指向派生类对象,这样就可以实现多态性调用。例如:

 Shape* s = new Circle();
 s->draw(); // 调用Circle类中的draw()函数
复制代码

在上面的例子中,我们使用基类指针s来访问Circle类的对象,因为Circle类重写了draw()函数,所以调用的是Circle类中的实现。这种行为称为运行时多态性,因为实际调用的函数是在运行时确定的。

多态的底层原理

在C++中,多态是通过虚函数表和虚指针来实现的。虚函数表是一个特殊的表格,其中包含了虚函数的地址。每个类都有一个虚函数表,其中包含了该类及其基类的虚函数地址。当一个对象被创建时,它将包含一个指向其类的虚函数表的指针,称为虚指针。当调用一个虚函数时,程序将首先查找该对象的虚指针,然后使用虚指针中的虚函数表来查找正确的函数地址。这种方法使得程序在运行时能够动态地选择正确的函数。

多态性的好处

多态性可以使代码更加灵活、可扩展和易于维护。多态性可以使代码更加通用,可以使同样的代码适用于不同的对象。多态性可以提高代码的复用性,可以减少代码的重复编写。多态性可以使代码更加易于维护,因为代码可以更加清晰、简洁和易于理解。

在实际编程中,多态性也是非常有用的。例如,我们可以使用多态性来编写一个通用的排序函数,该函数可以对不同类型的数据进行排序。另一个例子是图形界面编程,我们可以使用多态性来处理不同的用户输入事件。

总结

虚函数是实现多态性的关键,它允许不同的对象表现出不同的行为。当使用基类指针或引用来访问派生类对象时,虚函数将调用派生类中的实现,实现了运行时多态性。在面向对象的编程中,多态性是一个非常重要的概念,可以使代码更加灵活、可扩展和易于维护。多态性有两种形式:静态多态和动态多态。静态多态是通过函数重载实现的,而动态多态是通过虚函数实现的。虚函数的底层原理可以参考我之前的帖子,有详细的介绍,这里不做多展开。最后,多态性可以使代码更加通用、易于维护和提高复用性。

Supongo que te gusta

Origin juejin.im/post/7230303948924551229
Recomendado
Clasificación