Qué sucede cuando se llama a una función virtual dentro de una función no virtual en C++

Prediga la salida del siguiente programa C++ simple sin ninguna función virtual.

#include <iostream>
using namespace std;
  
class Base
{
public:
    void print()
    {
        cout << "Base class print function \n";
    }
    void invoke()
    {
        cout << "Base class invoke function \n";
        this -> print();
    }
};
  
class Derived: public Base
{
public:
    void print()
    {
        cout << "Derived class print function \n" ;
    }
    void invoke()
    {
        cout << "Derived class invoke function \n";
        this -> print();
    }
};
  
int main()
{
    Base *b = new Derived;
    b -> invoke();
    return 0;
}

Producción:

Base class invoke function
Base class print function

Dado que no hay una función virtual , el comportamiento polimórfico en tiempo de ejecución no funciona en el código anterior. Ahora prediga la salida del siguiente programa en C++.

#include <iostream>
using namespace std;
  
class Base
{
public:
    virtual void print()
    {
        cout << "Base class print function \n";
    }
    void invoke()
    {
        cout << "Base class invoke function \n";
        this -> print();
    }
};
  
class Derived: public Base
{
public:
    void print()
    {
        cout << "Derived class print function \n" ;
    }
    void invoke()
    {
        cout << "Derived class invoke function \n";
        this -> print(); // called under non - virtual function
    }
};
  
int main()
{
    Base *b = new Derived;
    b -> invoke();
    return 0;
}

Producción:

Base class invoke function
Derived class print function

Entonces, el comportamiento polimórfico funciona incluso cuando se llama a una función virtual dentro de una función no virtual. El resultado se puede adivinar por el hecho de que la función a llamar se decide en tiempo de ejecución utilizando vptr y vtable .

Este artículo es una contribución de Sumit Jaiswal . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *