构造函数和析构函数里调用虚函数问题

#include <iostream>
#include <string>
using namespace std;
class A
{
    
    
public:
	A()
	{
    
    
		cout << "A()" << endl;
		func();
	}
	virtual ~A()
	{
    
    
		func();
		cout << "~A()" << endl;
	}
	virtual void func()
	{
    
    
		cout << "A::func()" << endl;
	}
	void fun()
	{
    
    
		func();
	}
};

class B:public A
{
    
    
public:
	B()
	{
    
    
		cout << "B()" << endl;
		func();
	}
	~B()
	{
    
    
		func();
		cout << "~B()" << endl;
	}
	virtual void func()
	{
    
    
		cout << "B::func()" << endl;
	}
	void fun()
	{
    
    
		func();
	}
};
int main()
{
    
    
	A* obj = new B();
	delete obj;
}

在这里插入图片描述
从结果不难看出,一个父类指针new一个子类对象,一开始先去执行了父类的构造函数,这个时候在父类的构造函数里调用了虚函数,本来我们是一个父类指针new一个子类的对象,应该是希望调用的子类的虚函数,但是这个时候子类对象还没有构造出来,所以现在反而调用的是父类的虚函数了,,同理,在析构函数当中调用虚函数也是,,总结起来这个构造函数和析构函数里调用虚函数问题和一个具有继承关系的对象的构造和析构顺序有关。

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/120198138
今日推荐