在构造函数和析构函数调用 virutal 函数会产生什么后果?结合 Demo 分析。
时间: 2023-01-11 22:55:36 浏览: 117
C_Netdevice_Tunnel:通过 Virutal Net Device 和 Netfilter Hook 实现 UDP 隧道
在构造函数中调用虚函数会导致在构造函数执行期间,这个虚函数的行为是不确定的。
在构造函数的执行过程中,一个对象的状态还没有完全被初始化,如果在这个时候调用了虚函数,那么这个虚函数所在的类型(即这个虚函数是属于哪个类的)还没有被完全构造,这个虚函数的行为是不确定的。
析构函数中调用虚函数是没有问题的,析构函数是在对象被销毁之前调用的,此时对象的状态已经被完全构造完毕,调用虚函数是没有问题的。
下面是一个简单的示例:
```
#include <iostream>
class Base
{
public:
Base()
{
std::cout << "Base Constructor" << std::endl;
virtualFunction();
}
virtual ~Base()
{
std::cout << "Base Destructor" << std::endl;
virtualFunction();
}
virtual void virtualFunction()
{
std::cout << "Base virtualFunction" << std::endl;
}
};
class Derived : public Base
{
public:
Derived()
{
std::cout << "Derived Constructor" << std::endl;
}
~Derived()
{
std::cout << "Derived Destructor" << std::endl;
}
void virtualFunction()
{
std::cout << "Derived virtualFunction" << std::endl;
}
};
int main()
{
Derived d;
return 0;
}
```
输出结果为:
```
Base Constructor
Base virtualFunction
Derived Constructor
Derived Destructor
Base Destructor
```
可以看到
阅读全文