关于虚函数
1、构造函数不可能成为虚函数编译时不通过,因为在构造函数执行完之后,虚函数表指针才会被正确的初始化。但是析构函数可以可以为虚函数,而且在含有父类的程序设计当中,应该将析构函数设计为虚函数,防止在工程中造成了内存泄露的问题。#include <iostream>#include <string>using namespace std;class Base{...
·
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、析构函数中不可能发生多态行为,因为在析构函数执行时,虚函数表指针已经被销毁。
更多推荐
已为社区贡献1条内容
所有评论(0)