为生存而奔跑

   :: 首页 :: 联系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 323593
  • 排名 - 74

最新评论

阅读排行榜

评论排行榜

1、构造函数不能是虚函数。因为构造函数不是一个普通的函数,要构造一个对象,构造函数必须掌握所创建的对象的确切类型,因此构造函数不能是虚的。
2、析构函数可以是虚函数。首先我们要搞清楚为什么要虚析构函数?这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。也就是只有当静态类型为基类,而动态类型为子类时,为了确保子类的析构函数能被调用,基类的析构函数必须被声明为虚析构函数。
一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
3、纯虚函数
声明纯虚函数的方法:
virtual void purefun()=0;
声明一个纯虚函数pure virtual 的目的就是让Derived class只继承函数接口,因为它没有定义。但是实际上是可以有一份Defualt定义的,在使用时需要指出类名。如:
Derived->Base::Purefunction();
注意含有纯虚函数的类是不能被实例化的。如果Base类中有一个纯虚函数purefun(),Derived继承了Base后必须对purefun()进行重写,否则Derived也是一个函数纯虚函数的类,同样是不能被实例化的。
4、virtual函数的缺省参数值是静态绑定的,所以记住决不要重新定义继承而来的virtual 函数的缺省参数值。
#include<iostream>
#include
<algorithm>
#include
<string>
#include
<vector>
#include
<queue>
#include
<cmath>
#include
<map>
using namespace std;
class Base
{
public:
  
virtual void display(int i =1)
  {
     cout
<<"Base Display"<<endl;
  }
};
class Derived :public Base
{
public:
  
virtual void display(int i = 2)
  {
     
if(i  ==2)
         cout
<<"derived i==2"<<endl;
     
if(i == 1)
         cout
<<"derived i ==1"<<endl;
  }
};
int main()
{
    Base
* p=new Derived();
    p
->display();
}
输出是"derived i==1"
posted on 2009-08-31 16:57 baby-fly 阅读(291) 评论(0)  编辑 收藏 引用 所属分类: 技术

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理