1、构造函数不可能成为虚函数

在这里插入图片描述
编译时不通过,因为在构造函数执行完之后,虚函数表指针才会被正确的初始化。在这里插入图片描述
但是析构函数可以可以为虚函数,而且在含有父类的程序设计当中,应该将析构函数设计为虚函数,防止在工程中造成了内存泄露的问题。

#include <iostream>
#include <string>

using namespace std;

class Base
{
public:
	virtual  Base()
	{
		cout << "Base::Base() " << endl;

	}
	//~Base()  //第一次编译的结果
	virtual  ~Base()   //第二次编译的结果
	{
		cout << "~Base()" << endl;
	}

};

class Derived: public Base
{
public:
	Derived()
	{
		cout << "Derived:: Derived() " << endl;
	}

	}

	~Derived()
	{
		cout << "~ Derived() " << endl;
	}
};


int main()
{
	Base* p = new Derived(); 

	delete p; //释放时只调用了父类对象的析构函数
	return 0;
}

第一次编译输出的结果,只是调用了父类的析构函数,而没有调用子类的析构函数,因此子类没有被释放,造成了内存泄漏。
在这里插入图片描述
因此在这里应该将父类的析构函数声明为虚函数,编译器会根据指针的指向的实际对象去调用析构函数。第二次编译的结果
在这里插入图片描述

总结:
1、在程序设计过程中,出现父类函数应将父类函数的析构函数为虚函数

2、构造函数中不可能发生多态行为,因为在构造函数执行时,虚函数表指针未被正确初始化。
3、析构函数中不可能发生多态行为,因为在析构函数执行时,虚函数表指针已经被销毁。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐