码迷,mamicode.com
首页 > 其他好文 > 详细

Virtual以及虚析构函数

时间:2014-08-20 19:30:42      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   java   使用   os   ar   

Typedef int (*healthcalcfunc)(const gamecharacter&)

 

当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此,在子类从新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰。

 

友元函数 构造函数 static静态函数 不能用virtual关键字修饰;

普通成员函数 和析构函数 可以用virtual关键字修饰;

 

virtual函数的效果

即用基类指针指向继承类对象,接着便可以用该指针使用继承类的成员函数。

 

class Base
{
public:Base(){}
public:
       virtual void print(){cout<<"Base";}//可以不为空
};

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

int main()
{
       Base *point=new Derived();
       point->print();
}

Output
Derived 

 

 

虚析构函数的作用

C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢

 

class ClxBase

{

public:

    ClxBase() {};

    virtual ~ClxBase() {};

 

    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };

};

 

class ClxDerived : public ClxBase

{

public:

    ClxDerived() {};

    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

 

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };

};

    代码

 

ClxBase *pTest = new ClxDerived;

pTest->DoSomething();

delete pTest;

    的输出结果是:

 

Do something in class ClxDerived!

Output from the destructor of class ClxDerived!

    这个很简单,非常好理解。

    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:

 

Do something in class ClxDerived!

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。

    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

 

 

虚函数和纯虚函数

 

virtual void foo1();//虚函数

 

virtual void foo2() = 0;//纯虚函数

 

虚函数为了重载和多态的需要,子类中可以重写也可以不写基类中的此函数!

 

纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!

 

引入原因

1、为了方便使用多态特性,我们常常需要在基类中定义虚函数。(这点和虚函数一样)

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

 

带纯虚函数的类叫虚基类,这样的类也叫抽象类。这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。

Virtual以及虚析构函数,布布扣,bubuko.com

Virtual以及虚析构函数

标签:des   style   blog   http   java   使用   os   ar   

原文地址:http://www.cnblogs.com/notlate/p/3925295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!