MST

星途 面试题库

面试题:C++指向常变量指针在复杂数据结构中的应用场景

假设有一个复杂的类层次结构,其中包含多个继承关系和数据成员。请描述指向常变量指针在遍历该类对象组成的链表,且保证链表元素不被修改时的应用场景,并给出关键代码片段。
15.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

应用场景

在遍历由复杂类对象组成的链表且不希望修改链表元素时,指向常变量指针非常有用。当链表中的类对象具有复杂的继承关系和数据成员时,使用指向常变量指针可以确保在遍历过程中不会意外修改对象的任何数据成员,这对于只读操作(如统计、查找特定元素、显示对象信息等)非常重要,同时也符合设计原则中对于数据保护的要求。

关键代码片段

假设我们有一个基类 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 用于在遍历过程中安全地访问派生类对象的额外数据成员。