虚函数和虚基类

说明:
1.如果一个类是作为基类使用,那么他的虚构函数一定要是虚的,即用virtual关键字(参数为零则为纯虚函数).
  否则会有内存泄漏(很重要),因为当用基类的指针删除一个派生类的对象时,要调用派生类的析构函数.但是
  其子类或者子子类可以的析构函数可以是虚函数,也可以不是虚函数.(不加virtual 关键字则不会调用派生
  类的析构函数,而上面用了ClxBase *pTest = new ClxDerived;语句也就是new的ClxDerived对象没有   销毁,所以产生内存泄漏)
2.类中的虚函数,如果一个类中的函数被声明成为虚函数,那么其子类不用在声明为虚函数(当子类还有子类时),
  也可以声明为虚函数.结果是一样的.同虚析构函数的道理是一样的.当然,并不是要把所有类的析构函数都写
  成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就
  会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

 

具体例子:

#include "iostream.h"

 

class ClxBase
{
public:
 ClxBase() {};
 virtual ~ClxBase() { cout << "Output from the destructor of class ClxBase!" << endl; };
 virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};


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

 //此处的virtual可以去掉
 virtual void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };

 //此处的virtual可以去掉
};


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

 //此处的virtual可以去掉
 virtual void DoSomething(){cout << "Do something in class ClxThrived!" << endl;}

 //此处的virtual可以去掉
};
void main()
{
 ClxBase *pTest1 = new ClxBase;
 pTest1->DoSomething();
    delete pTest1;//1

 ClxBase *pTest2 = new ClxDerived;
 pTest2->DoSomething();
    delete pTest2;//2 用基类的指针删除一个派生类的对象时

 ClxDerived *pTest3 = new ClxDerived;
 pTest3->DoSomething();
    delete pTest3;//3

 ClxBase *pTest4 = new ClxThrived;
 pTest4->DoSomething();
    delete pTest4;//4 用基类的指针删除一个派生类的对象时

 ClxDerived *pTest5 = new ClxThrived;
 pTest5->DoSomething();
    delete pTest5;//5 用基类的指针删除一个派生类的对象时

 ClxThrived *pTest6 = new ClxThrived;
 pTest6->DoSomething();
    delete pTest6;//6
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值