【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;
}
编译结果如下:
翻译过来就是:“内联”是构造函数的唯一合法存储类
具体的原因在于: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;
}
编译的结果如下:
可以看出,当一个指向基类的基类指针被删除时,会调用基类的析构函数。
而当把 指针指向子类时:
Base* b = new Sub;
编译结果如下:
可以看出,当指针指向子类时,指针被删除会调用基类析构函数,而不调用子类的构造函数,原因在上一篇博客也有论述,就是被重写了,这样的结果不利于清理内存,导致内存过大,所以解决的方案是将析构函数设置为虚函数。
#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++】虚函数(三)——多态与绑定
上一篇: jQuery的find()方法怎么使用
下一篇: jQuery中数组如何使用?(附示例)