Funciones virtuales y funciones virtuales puras en C++

funcion virtual

El núcleo de la orientación a objetos es el polimorfismo, y las funciones virtuales son el núcleo del polimorfismo.Antes de hablar de las funciones virtuales, primero debemos hablar del polimorfismo, qué es el polimorfismo. Hablando palabras humanas: el puntero del tipo de clase principal apunta a la subclase y luego usa el puntero de la clase principal para llamar a la función de la subclase. Pero hay un problema: la función llamada con el puntero de la clase principal ejecutará el método en la clase principal, independientemente del tipo.

#include <iostream>
using namespace std;

class AA {
public:
    void show() {
        cout << "调用父类AA的show()方法" << endl;
    }
};

class BB : public AA{
public:
    void show() {
        cout << "调用子类BB的show()方法" << endl;
    }
};

int main() {
    AA* a = new BB();
    a->show();
}

Obviamente, el puntero de AA apunta a BB, pero el método de ejecución es de hecho AA

Para resolver este problema, existen funciones virtuales. Agreguemos virtual antes del método show de AA. pruébalo primero

#include <iostream>
using namespace std;

class AA {
public:
    virtual void show() {
        cout << "调用父类AA的show()方法" << endl;
    }
};

class BB : public AA{
public:
    void show() {
        cout << "调用子类BB的show()方法" << endl;
    }
};

int main() {
    AA* a = new BB();
    a->show();
}

Es muy obvio que se llama el método de BB.

La diferencia entre funciones virtuales y no virtuales

La función no virtual en realidad se determina de acuerdo con el tipo de objeto, referencia o puntero que llama a la función en tiempo de compilación.En el primer programa en ejecución, el tipo de puntero de a es AA, por lo que el método show en la clase AA es llamado.

La función virtual solo puede determinar a qué función llamar en tiempo de ejecución y selecciona dinámicamente la función miembro apropiada durante la fase de ejecución del programa. Si hay una reescritura en la subclase, se ejecutará la versión reescrita. De lo contrario, la función virtual (principal versión de clase).

Cómo funcionan las funciones virtuales

Las funciones virtuales se implementan a través de una tabla de funciones virtuales. VTable para abreviar. En esta tabla, se trata principalmente de una tabla de direcciones de funciones virtuales de una clase.Esta tabla resuelve el problema de la herencia y la cobertura, lo que equivale a un mapa, que indica la función real que se debe llamar.

función virtual pura

Una función virtual pura es un tipo especial de función virtual. En algunos casos, la clase base no puede proporcionar una implementación significativa para la función virtual, por lo que se declara como una función virtual pura.

Por ejemplo: una clase de animal puede tener gatos, perros, tigres, leones, etc. Pero obviamente no es razonable que uses al animal mismo para generar objetos. Por ejemplo, los gatos pueden trepar a los árboles, pero no todos los animales pueden trepar a los árboles. Para evitar el uso directo de la clase principal (clase animal) para crear objetos, se deben usar funciones virtuales puras.

#include <iostream>
using namespace std;

class animal {
public:
    virtual void  pashu() = 0;

class cat : public animal {
public:
    void pashu() {
        cout << "我是小猫,我会爬树" << endl;
    }
};


int main() {
    animal* a = new cat();
    a->pashu();

    animal* a = new animal();   // 直接报错

}

Una función virtual pura reserva el nombre de una función en la clase base para la clase derivada para que la clase derivada pueda redefinirla. No se admite el polimorfismo si el nombre de la función no se conserva en la clase base. Una clase que contiene funciones virtuales puras se denomina clase abstracta, los objetos no se pueden instanciar y se pueden crear punteros y referencias.

La clase derivada debe redefinir la función virtual pura en la clase abstracta, de lo contrario, también es una clase abstracta.

La declaración de una función virtual pura le dice al diseñador de la subclase: "Debe proporcionar una implementación de una función virtual pura, pero no sé cómo la implementará".

Supongo que te gusta

Origin blog.csdn.net/qq_35326529/article/details/128975709
Recomendado
Clasificación