先决条件: 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等的更多准备工作,请参阅“完整面试准备课程” 。