【线性表】【线性表的抽象类形式】【无需创建表的操作——利用构造函数】【纯虚析构函数的作用——解决内存泄漏】

【线性表的抽象类形式】

        把每一个操作都定义成一个纯虚函数,如果该类派生出一个类时,那么要重写这些纯虚函数;如果不重新定义这些纯虚函数,这些纯虚函数就留在了派生类中,那么派生类也变成了一个抽象类不能真正使用

先放代码如下:

template<class elemType>
class list
{
public:
	virtual void clear() = 0;//清除
	virtual int length() const = 0;//长度
	virtual void insert(int i, const elemType& x) = 0;//插入
	virtual void remove(int i) = 0;//删除
	virtual int search(const elemType& x) const = 0;//搜索
	virtual elemType visit(int i) const = 0;//访问
	virtual void traverse() const = 0;//遍历
	virtual ~list() {}; //虚析构函数
};

【无需创建表的操作】

        相比于线性表的操作少了一个create()函数——创建一个空的线性表,这个在我们定义一个对象的时候,就是一个对象的初值,因此把create()函数变为了每个类的构造函数,让每个类的构造函数完成create()的工作

【虚析构函数的作用】

        在代码段的倒数第二行,有一个虚析构函数 virtual ~list() {},这是为了解决父类指针指向子类对象时,释放子类对象的资源时,释放不完全,造成的内存泄漏问题

简要解释一下,为何会有内存泄漏问题

        动态内存的申请在构造函数中,因此需要在析构函数中delete掉。

        其中有一种用法,用基类指针指向派生类的对象,也可以用一个指向抽象类的指针去指向一个具体的实现类。在这种情况下,如果没有虚析构函数delete这个指针的时候会造成内存泄漏。        

        当我们用一个指向抽象类的指针去指向一个具体的实现类的对象的时候,delete这个指针的时候,会调用基类的析构函数,因为基类析构函数是一个虚函数,于是它又会派生类里面,去找派生类有没有定义析构函数,如果派生类定义了析构函数,那么就会执行这个析构函数,此时就释放了这些动态空间。

        如果抽象类设置了一个析构函数不是虚析构函数),那么在delete这个指针的时候,只释放了父类的指针子类的指针并没有释放完全,所以要在抽象类中设置虚析构函数以防内存泄漏

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值