wal*_*lly 7 c++ inheritance constructor using-declaration
using基础构造函数的声明是私有的,但仍然可以构造该类.为什么?
可访问性对于必须公开operator[]的using声明的工作方式不同.
#include <vector>
template<typename T>
class Vec : std::vector<T>
{
private:
using std::vector<T>::vector; // Works, even if private. Why?
public:
using std::vector<T>::operator[]; // must be public
};
int main(){
Vec<int> vec = {2, 2};
auto test = vec[1];
}
Run Code Online (Sandbox Code Playgroud)
如果我希望构造函数是私有的,该怎么办?可以用using声明来完成吗?
无论基类的可访问性如何,基类构造函数的using声明都保持与基类相同的可访问性.来自[namespace.udecl]:
由using声明创建的同义词具有成员声明的通常可访问性.命名构造函数的using-declarator不会创建同义词; 相反,如果在用于构造相应基类的对象时可以访问其他构造函数,则可以访问这些构造函数,并忽略using声明的可访问性
重点补充
用简单的英语,从cppreference:
它具有与相应基础构造函数相同的访问权限.
如果希望"继承"构造函数为私有,则必须手动指定构造函数.您不能使用using声明来执行此操作.