使用"使用"在公共场合继承私有构造函数并不公开

时间:2017-04-07 14:24:55

标签: c++ inheritance constructor

"使用"私有成员变量使其成为公共成员,但构造函数保持私有。例如:

class MyClass;

class Base
{
  private:
    Base(float v) : m_v{v} {}
    float m_v;

    friend MyClass;
};

class MyClass: public Base
{
  public:
    using Super = Base;

    using Super::Super; // this is still private
    using Super::m_v; // this is public
};

int main()
{
  MyClass x{3.4f}; // error - calling a private constructor of class 'Base'
  (void)x.m_v; // not an error

  return 0;
}

除了写这样的通用ctor之外还有其他方法吗?

template<typename... Args>
MyClass(Args&&... args) : Super(std::forward<Args>(args)...) {}

1 个答案:

答案 0 :(得分:1)

http://en.cppreference.com/w/cpp/language/using_declaration#Inheriting_constructors包含以下段落:

  

它具有与相应基本构造函数相同的访问权限。如果用户定义的构造函数满足constexpr构造函数要求,则为constexpr。如果删除相应的基本构造函数或者删除默认的默认构造函数,则删除它(除了构造函数被继承的基础的构造不计算)。继承构造函数不能显式实例化或显式专门化。

指的是继承的构造函数。我不确定为什么,但看来你的方法是明确被禁止的。通常的解决方案是定义通用转发构造函数。