构造函数继承 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;
(注意:如果在继承的构造函数上定义了额外的构造函数,则需要显式定义默认构造函数)
我有一棵树的这段代码。节点包含实际数据。 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;
(注意:如果在继承的构造函数上定义了额外的构造函数,则需要显式定义默认构造函数)