使用C++设计一个名为LinkList的基类,使其能够派生出队列类和栈类,并回答以下问题: (1) 为什么要将LinkList类的析构函数定义为虚函数? (2) 如果想让LinkList类更通用一些,如可以随机访问表中任意位置的节点值,可以顺序依次访问链表中的各个节点,类的定义应该做哪些修改?参考Visual C++MFC库中预定义的列表类CObList,看看通用的列表类会提供哪些操作。
时间: 2024-03-02 07:52:46 浏览: 25
好的,让我来回答您的问题。
首先,以下是我设计的LinkList基类的代码:
```c++
class LinkList {
public:
virtual void add(int val) = 0;
virtual int remove() = 0;
virtual int size() = 0;
virtual ~LinkList() {}
};
```
根据您的要求,这个基类只提供了添加、删除和返回链表大小的纯虚函数,没有实现具体的链表操作。这样可以让派生的队列类和栈类分别实现它们自己的数据结构。
现在回答您的问题:
1. 为什么要将LinkList类的析构函数定义为虚函数?
将析构函数定义为虚函数是为了在使用基类指针指向派生类对象并使用delete操作符删除时,能够调用到派生类的析构函数。如果不定义为虚函数,则只会调用基类的析构函数,无法释放派生类的资源,可能会造成内存泄漏等问题。
2. 如果想让LinkList类更通用一些,如可以随机访问表中任意位置的节点值,可以顺序依次访问链表中的各个节点,类的定义应该做哪些修改?参考Visual C++MFC库中预定义的列表类CObList,看看通用的列表类会提供哪些操作。
如果想让LinkList类更通用,可以添加以下成员函数:
```c++
virtual int get(int index) = 0;
virtual void set(int index, int val) = 0;
virtual void clear() = 0;
```
其中,get函数可以返回指定位置的节点值,set函数可以设置指定位置的节点值,clear函数可以清空整个链表。
与此类似,CObList类提供了以下操作:
- GetAt(pos):返回指定位置的元素。
- SetAt(pos, newElement):将指定位置的元素设为新的值。
- RemoveAt(pos):删除指定位置的元素。
- InsertAfter(pos, newElement):在指定位置后插入一个元素。
- GetCount():返回列表中元素的数量。
- RemoveAll():删除所有元素。
希望我的回答能够帮助您!