所以我在《C 和 C++ 中的数据结构与算法》中看到了这段代码片段:
class DLinkedList { // doubly linked list
public:
DLinkedList(); // constructor
~DLinkedList(); // destructor
bool empty() const; // is list empty?
const Elem& front() const; // get front element
const Elem& back() const; // get back element
void addFront(const Elem& e); // add to front of list
void addBack(const Elem& e); // add to back of list
void removeFront(); // remove from front
void removeBack(); // remove from back
private: // local type definitions
DNode* header; // list sentinels
DNode* trailer;
protected: // local utilities
void add(DNode* v, const Elem& e); // insert new node before v
void remove(DNode* v); // remove node v
};
我的问题是:为什么成员函数是
add()
和 remove()
protected
(以及何时应该使用关键字 protected
)
编辑:
DNode
在这里定义:
typedef string Elem; // list element type
class DNode { // doubly linked list node
private:
Elem elem; // node element value
DNode* prev; // previous node in list
DNode* next; // next node in list
friend class DLinkedList; // allow DLinkedList access
};
当您不希望API查看某些方法,但想要想要从类及其子类(包外部或包内)以及同一包中的类访问该方法时,请使用受保护的
add()和remove()受到保护的原因是提供数据抽象并防止未经授权的人员使用这些函数
SO protected 意味着它只能由派生类(在本例中是从 Dlinkedlist 类继承的类)或此类的友元使用(请参阅声明类的友元)。然而,很难说出作者声明它们受保护的含义
Protected 仅当该类用作继承的基类时才有意义。受保护的方法只能从类或派生类中的方法访问。
我希望您会发现作者继续定义从 DLinkedList 派生的其他示例数据结构。
add() 和remove() 函数被标记为受保护,以限制它们对DLinkedList 类和任何派生类的访问。这确保了这些操作列表内部结构的方法不会暴露给外部代码,从而保持封装并防止误用。
当您想要允许派生类访问某些成员或函数,但让它们对类的通用公共接口隐藏时,您应该使用 protected 关键字。这对于类功能所必需的实用函数或内部操作特别有用,但外部用户不应访问或修改这些函数或内部操作。