欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【c++】虚函数(四)—— 构造(析构)函数可以是虚函数吗?

程序员文章站 2022-03-15 16:26:26
...

话不多说

直接进入主题

————————————下面是正文——————————————

NO.1 :构造函数可以是虚函数吗?  

             答案是否定的~,可参照以下代码:

#include <iostream>

using namespace std;

class test
{
public:
	int x;
	int y;

	virtual test()
	{
		cout<<"The tset is beinging"<<endl;
		x = 1;
		y = 2;
	}
};

void main()
{
	test t;
}

编译结果如下:

【c++】虚函数(四)—— 构造(析构)函数可以是虚函数吗?

翻译过来就是:“内联”是构造函数的唯一合法存储类

具体的原因在于:1. 虚函数是需要调用虚函数表的

                            2.虚函数表需要在构造函数里面进行初始化

                            3.如果构造函数是虚函数,由于没有虚函数表,所以构造函数不能是虚函数

 

No.2 析构函数可以是虚函数吗?

         答案是可以的~ 而且最好是虚函数!(当然,如果没有继承关系,只是一个简单的类,就不需要)原因请看以下这段代码:

#include <iostream>

using namespace std;

class Base
{
public:

	Base()
	{
		cout<<"The Base is beinging"<<endl;
	}
    ~Base()
	{
		cout<<"The ~Base is finshing"<<endl;
	}
};


class Sub : public Base
{
public:

	Sub()
	{
		cout<<"The Sub is beinging"<<endl;
	}
     ~Sub()
	{
		cout<<"The ~Sub is finshing"<<endl;
	}
};

void main()
{
	Base* b = new Base;
	
	delete b;
}

编译的结果如下:

【c++】虚函数(四)—— 构造(析构)函数可以是虚函数吗?

可以看出,当一个指向基类的基类指针被删除时,会调用基类的析构函数

而当把 指针指向子类时:

Base* b = new Sub;

编译结果如下:

【c++】虚函数(四)—— 构造(析构)函数可以是虚函数吗?

       可以看出,当指针指向子类时,指针被删除会调用基类析构函数,而不调用子类的构造函数,原因在上一篇博客也有论述,就是被重写了,这样的结果不利于清理内存,导致内存过大,所以解决的方案是将析构函数设置为虚函数。

#include <iostream>

using namespace std;

class Base
{
public:

	Base()
	{
		cout<<"The Base is beinging"<<endl;
	}
    virtual ~Base()
	{
		cout<<"The ~Base is finshing"<<endl;
	}
};


class Sub : public Base
{
public:

	Sub()
	{
		cout<<"The Sub is beinging"<<endl;
	}
    virtual ~Sub()
	{
		cout<<"The ~Sub is finshing"<<endl;
	}
};

void main()
{
	Base* b = new Sub;
	
	delete b;
}

编译的结果如下:

【c++】虚函数(四)—— 构造(析构)函数可以是虚函数吗?

如果想要了解为什么会这样,可以参考我上一篇推文:【c++】虚函数(三)——多态与绑定