Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174063
  • 博文数量: 65
  • 博客积分: 1790
  • 博客等级: 上尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 23:51
文章分类
文章存档

2012年(8)

2011年(38)

2010年(19)

分类: C/C++

2011-02-24 23:44:18

构造函数不能声明为虚函数。

解释一:所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你 在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类 的构造函数将被覆盖,也即不能完成父类的构造,就会出错。
解释二:虚函数的主要意义在于被派生类继承从而产生多态,派生类的构造函数中,编译器会加入构造基类的代码, 如果基类的构造函数用到参数,则派生类在其构造函数的初始化列表中必须为基类给出参数,就是这个原因。

析构函数设为虚函数的作用。

解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针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
因此析构函数不声明为虚函数容易造成内存泄漏。

参考:

构造函数、析构函数是否要声明为虚函数的问题

阅读(753) | 评论(0) | 转发(0) |
0

上一篇:C++内存问题

下一篇:C++中的临时对象

给主人留下些什么吧!~~