构造函数继承 C++,它提供了什么?

Constructor inheritance C++, what does it offer?

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

添加任何新字段

如果我注释掉构造函数继承 using unique_ptr<BSTnode<Key,Data>>::unique_ptr 我的代码继续工作,那么它到底做了什么?

template <class Key, class Data>
class BST : public unique_ptr<BSTnode<Key, Data>>
{
using unique_ptr<BSTnode<Key, Data>>::unique_ptr;
BST<Key, Data>() = default;
~BST<Key, Data>() = default;
BST<Key, Data>(const BST<Key, Data> &other) = delete;
BST<Key, Data>(BST<Key, Data> &&other) = default;
BST<Key, Data> &operator=(const BST<Key, Data> &other) = delete;
BST<Key, Data> &operator=(BST<Key, Data> &&other) = default;

BST<Key, Data>(unique_ptr<BSTnode<Key, Data>> &&nodeptr) : 
unique_ptr<BSTnode<Key, Data>>(move(nodeptr)){};

BST<Key, Data> &operator=(unique_ptr<BSTnode<Key, Data>> &&nodeptr)
{       
    this->unique_ptr<BSTnode<Key, Data>>::operator=(move(nodeptr));
    return *this;
};
}

测试程序:

int main(int argc, char** argv){
    BST<int,int> t; // default constructor
    t.add(1,1);
    BST<int,int> t2 = move(t); // move constructor
    // BST<int,int> t3 = t2; // copy constructor is deleted
    BST<int,int> t4; // default constructor
    t4 = move(t2); // move operator
    // t4 = t3; // copy operator=deleted !

    BST<int,int> nodeptr = std::make_unique<BSTnode<int,int>>(); // + 
    // + node move constructor
    t4 = move(nodeptr); // node move operator=
    return 0;
}

您还没有穷尽构建 std::unique_ptr<BSTnode<Key, Data>>

的方法
BST<int,int> t5{ new BSTnode<int,int> }; // from raw pointer
BST<int,int> t6{ nullptr }; // from nullptr

但是如果你穷尽添加 using 会添加的所有内容,那么它就变得多余了

构造函数继承的要点是,您想说 "all the constructors are just like in the super-class" 使用 一个源代码行 ,而不是每个构造函数一行。

所以如果你想使用这个特性,你应该删除你所有的构造函数定义:

BST<Key, Data>() = default;
~BST<Key, Data>() = default;
BST<Key, Data>(const BST<Key, Data> &other) = delete;
BST<Key, Data>(BST<Key, Data> &&other) = default;
BST<Key, Data> &operator=(const BST<Key, Data> &other) = delete;
BST<Key, Data> &operator=(BST<Key, Data> &&other) = default;
BST<Key, Data>(unique_ptr<BSTnode<Key, Data>> &&nodeptr) : 
unique_ptr<BSTnode<Key, Data>>(move(nodeptr)){};

用一行代码替换它们:

using unique_ptr<BSTnode<Key, Data>>::unique_ptr;

(注意:如果在继承的构造函数上定义了额外的构造函数,则需要显式定义默认构造函数)