C++使用virtual析构函数的原因

1.如果基类中的成员函数是virtual类型的,其继承类中相应的函数也是virtual类型,并且基类对象的引用指向继承类对象时,
基类就可以调用继承类函数,否则调用的是基类函数

class base

{

public:

virtual void fun(){ printf("base fun");}

};

  

class derived:public base

{

public:

void fun(){ printf("derived fun");}

};

  

derived der;

base &b = der; //或者base *b = &der;

b.fun(); //或者b->fun(); 输出的结果是 derived fun;调用的是子类的函数

//注意是在基类引用指向子类对象时才行; base b = der; 这个不行

2.virtual析构函数有什么用? 如

base * get()
{
derived * p = new derived;
return p;
}
这样base类就可以调用子类函数,最后要释放new出来的内存
base *ba = get();
delete ba;
因为base类的析构函数不是virtual类型的,所以delete ba这一边中只能调用基类的析构函数,无法调用子类的析构函数,
这可能导致子类内存无法释放完毕
所以在基类中的析构函数定义为virtual类型,这样delete ba时就可以调用子类的析构函数

3.关于虚函数表的详细介绍,看链接 http://blog.csdn.net/haoel/article/details/1948051

 

#include <iostream>

using namespace std;

  

class base

{

   public:

    void fun1(){ cout << "base fun1" << endl;}

    virtual void fun2(){ cout << "base fun2" << endl;}

    virtual ~base(){ cout << "base的析构函数 " << endl;} //注意virtual的析构函数的意义

};

  

class derived:public base

{

   public:

    void fun1(){ cout << "derived fun1" << endl;}

    virtual void fun2(){ cout << "derived fun2" << endl;}

    virtual ~derived(){ cout << "derived的析构函数" << endl;}

};

  

base* get()

{

    derived *der = new derived;

    return der;

}

  

int _tmain(int argc, _TCHAR* argv[])

{

    derived d;

    //base   * b = &d;

    base  *b = get();

        b->fun1();

        b->fun2();

    delete b;

    return 0;

}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值