构造函数、析构函数是否要声明为虚函数的问题
2011-05-27 09:28
253 查看
构造函数不能是虚函数的原因:
l 从概念上来说,如前所述,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。构造函数的功能是为一个对象在内存中分配空间,也就是说,此时该对象的类型已经确定了,编译系统确切的知道应该调用哪一个类的构造函数,不需要也不可能应用动态绑定。
l 从实现上来说,每个对象的VPTR是需要构造函数来初始化的(当然是由编译系统自动加进去的代码来实现),在构造函数没有调用之前,VPTR没有形成,根本就不可能实现动态绑定。
析构函数设为虚函数的作用:
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
例:
#include "stdafx.h"
#include "stdio.h"
class A
{
public:
A();
virtual ~A();
};
A::A()
{
}
A::~A()
{
printf("Delete class AP/n");
}
class B : public A
{
public:
B();
~B();
};
B::B()
{
}
B::~B()
{
printf("Delete class BP/n");
}
int main(int argc, char* argv[])
{
A *b=new B;
delete b;
return 0;
}
输出结果为:Delete class B
Delete class A
如果把A 的virtual 去掉:
那就变成了Delete class A
因此析构函数不声明为虚函数容易造成内存泄漏。
l 从概念上来说,如前所述,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。构造函数的功能是为一个对象在内存中分配空间,也就是说,此时该对象的类型已经确定了,编译系统确切的知道应该调用哪一个类的构造函数,不需要也不可能应用动态绑定。
l 从实现上来说,每个对象的VPTR是需要构造函数来初始化的(当然是由编译系统自动加进去的代码来实现),在构造函数没有调用之前,VPTR没有形成,根本就不可能实现动态绑定。
析构函数设为虚函数的作用:
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
例:
#include "stdafx.h"
#include "stdio.h"
class A
{
public:
A();
virtual ~A();
};
A::A()
{
}
A::~A()
{
printf("Delete class AP/n");
}
class B : public A
{
public:
B();
~B();
};
B::B()
{
}
B::~B()
{
printf("Delete class BP/n");
}
int main(int argc, char* argv[])
{
A *b=new B;
delete b;
return 0;
}
输出结果为:Delete class B
Delete class A
如果把A 的virtual 去掉:
那就变成了Delete class A
因此析构函数不声明为虚函数容易造成内存泄漏。
相关文章推荐
- 构造函数、析构函数是否要声明为虚函数的问题(网络转载)
- 构造函数、析构函数是否要声明为虚函数的问题
- 构造函数、析构函数是否要声明为虚函数的问题
- c++有关构造函数和析构函数中调用虚函数问题
- C++中构造函数和析构函数避免调用虚函数的问题 转载
- delete 一个dll中的类指针时,由于是否显示声明virtual 析构函数导致的问题 (英文解答)
- 构造函数和析构函数能否声明为虚函数,能否在里面调用虚函数
- 构造函数和析构函数中调用虚函数有什么问题?
- 构造函数析构函数是否为虚函数
- C++中构造函数和析构函数避免调用虚函数的问题
- 构造函数和析构函数中调用虚函数有什么问题
- C++中构造函数和析构函数避免调用虚函数的问题
- 构造函数,析构函数内调用虚函数问题
- C++中构造函数和析构函数避免调用虚函数的问题
- C++中构造函数和析构函数避免调用虚函数的问题
- (1)为什么构造函数的名字用类名?(2)构造函数返回值问题;(3)析构函数和构造函数定义为虚函数;
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数
- C++中 构造函数 析构函数 能否调用虚函数的问题
- javascript 直接创建对象与间接创建对象 私有函数不能访问this变量 是否使用var声明变量几个问题探讨