面试题答案
一键面试应用场景
在遍历由复杂类对象组成的链表且不希望修改链表元素时,指向常变量指针非常有用。当链表中的类对象具有复杂的继承关系和数据成员时,使用指向常变量指针可以确保在遍历过程中不会意外修改对象的任何数据成员,这对于只读操作(如统计、查找特定元素、显示对象信息等)非常重要,同时也符合设计原则中对于数据保护的要求。
关键代码片段
假设我们有一个基类 Base
和一个派生类 Derived
,链表节点类 Node
包含一个指向 Base
类对象的指针。
#include <iostream>
class Base {
public:
int data;
Base(int d) : data(d) {}
};
class Derived : public Base {
public:
int extraData;
Derived(int d, int ed) : Base(d), extraData(ed) {}
};
class Node {
public:
const Base* obj;
Node* next;
Node(const Base* o, Node* n = nullptr) : obj(o), next(n) {}
};
void traverseList(const Node* head) {
const Node* current = head;
while (current != nullptr) {
// 访问对象数据,确保不会修改
std::cout << "Data: " << current->obj->data << std::endl;
// 如果是Derived对象,可以进行动态类型转换后访问额外数据
const Derived* derivedObj = dynamic_cast<const Derived*>(current->obj);
if (derivedObj != nullptr) {
std::cout << "Extra Data: " << derivedObj->extraData << std::endl;
}
current = current->next;
}
}
你可以这样使用:
int main() {
const Base* baseObj1 = new Base(10);
const Derived* derivedObj1 = new Derived(20, 30);
Node* head = new Node(baseObj1, new Node(derivedObj1));
traverseList(head);
// 释放内存
Node* current = head;
Node* next;
while (current != nullptr) {
next = current->next;
delete current->obj;
delete current;
current = next;
}
return 0;
}
在上述代码中,traverseList
函数使用指向常变量的指针来遍历链表,保证链表中的对象不会被修改。dynamic_cast
用于在遍历过程中安全地访问派生类对象的额外数据成员。