📜  在C++中的构造函数/析构函数中调用虚拟方法

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

先决条件: C++中的虚函数

在大多数情况下,从构造函数或析构函数调用虚拟函数被认为是危险的,必须尽可能避免。所有C++实现都需要调用在当前构造函数中层次结构级别定义的函数的版本,而无需进一步调用。
您可以在构造函数中调用虚拟函数。这些对象是从头开始构造的,即“派生之前的基础”。

// CPP program to illustrate 
// calling virtual methods in 
// constructor/destructor
#include
using namespace std;
  
class dog
{
public:
    dog() 
    {
        cout<< "Constructor called" <

输出:

Constructor called
Virtual method called
Derived class Constructor called
Derived class Virtual method called
Virtual method called

解释:

  • 狗类中的树皮方法在构造函数和析构函数中均被调用。
  • 创建Yellowdog对象时,先调用dog的构造函数,然后再调用Yellowdog的构造函数,并调用相反的析构函数顺序。
  • 虽然树皮方法是虚拟方法,但是当在构造函数内部调用它时,它将表现为非虚拟方法,因为在上面的代码中调用dog(base)类的构造函数时,Yellowdog(derived)类不是由该方法构造的时间。
  • 因此,调用尚未构造对象的类的成员函数是危险的,编译器调用bark方法的dog类版本。与析构函数相同,当销毁Yellowdog的对象’d’时,首先调用Yellowdog类的析构函数,然后调用dog类的析构函数,但是此时Yellowdog已被销毁,因此调用了树皮的Dog类版本。

注意:强烈建议避免从构造函数/析构函数中调用虚拟方法。

虚拟功能测验

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