这个 class 设置是否违反了 Liskov 替换原则

Does this class setup violate the Liskov Substitution Principle

我有一棵树的这段代码。 BST 节点包含实际数据。 BST 是它们的包装器,继承自 unique_ptr<BSTnode<Key,Data>>。 BST 不会向 class.

添加任何新字段

继承使我的树成为 unique_ptr<BSTnode>,但这是实现它的正确方法吗?为 BST 添加的操作,如 rotate() / insert() 或 remove() 是特定于数据结构的。您不会也不应该期望它们用于常规 unique_ptr,但这确实意味着 BST 不能与 unique_ptr 互换使用。

如果这个实现策略不对,应该怎么解决?

template <class Key, class Data>
class BST : public unique_ptr<BSTnode<Key, Data>>
{
using unique_ptr<BSTnode<Key, Data>>::unique_ptr;
// operations ...
};

template <class Key, class Data>
class BSTnode
{
friend class BST<Key, Data>;

public:
//constructors ...

protected:
Key key;
Data data;
BSTnode<Key, Data> *parent;
BST<Key, Data> left, right;
};    

LSP 除了,继承标准 classes 通常是有问题的,并且在大多数情况下不是推荐的解决方案。在这种情况下,正如@SomeProgrammerDude 建议的那样,最好使用组合并将指针放在 class:

template <class Key, class Data>
class BST
{
    std::unique_ptr<BSTnode<Key, Data>> root;
    // operations ...
};

无论如何,没有人会想要使用您的 BST class 来替换 unique_ptr。它是一个单独的数据容器,恰好利用 unique_ptr 来存储其数据。