📜  在C++中的非虚函数内部调用虚函数时会发生什么

📅  最后修改于: 2021-05-30 11:34:42             🧑  作者: Mango

预测以下没有任何虚函数的简单C++程序的输出。

#include 
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;
}

输出:

Base class invoke function
Base class print function

由于没有虚函数,因此运行时多态行为在以上代码中不起作用。现在预测以下C++程序的输出。

#include 
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;
}

输出:

Base class invoke function
Derived class print function

因此,即使在非虚函数内部调用虚函数时,多态行为也可以工作。输出可以从一个事实,即要调用的函数是在运行时使用的vptr和虚函数表决定猜测。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”