使用'using'关键字使继承的构造函数public

rbu*_*rny 9 c++ testing inheritance using c++11

我正在尝试测试我班级的受保护方法和构造函数.为此,我尝试将其子类化,并使用C++ 11 using关键字将其成员重新导出为public :

class Foo {
  protected:
   Foo(int i) {}
   void run() {}
};

class TestableFoo : public Foo {
  public:
   using Foo::Foo;
   using Foo::run;
};

int main() {
  TestableFoo foo(7);
  foo.run();
}
Run Code Online (Sandbox Code Playgroud)

但是,g ++和clang ++都无法编译它,产生以下错误:

test.cpp:13:15: error: ‘TestableFoo::TestableFoo(int)’ is protected
    using Foo::Foo;
               ^
test.cpp:18:16: error: within this context
   TestableFoo foo(7);
                    ^
Run Code Online (Sandbox Code Playgroud)

即使run方法公开(我单独确认),TestableFoo构造函数仍然受到保护.为什么会这样?我可以理解决策(继承与覆盖可见性),但为什么方法和构造函数之间存在不一致?

Tem*_*Rex 5

该标准明确指出继承的构造函数保留其访问级别:

12.9 继承构造函数 [class.inhctor]

1 命名构造函数的 using 声明 (7.3.3) 隐式声明了一组继承构造函数。来自Xusing 声明中命名的类的继承构造函数的候选集由实际构造函数和由默认参数转换产生的名义构造函数组成,如下所示:

[案例列表省略]

4如此声明的构造函数与 X 中的相应构造函数具有相同的访问权限。如果删除了相应的构造函数X (8.4),则将其删除。

你当然可以直接调用它:

TestableFoo(int i) : Foo(i) { }
Run Code Online (Sandbox Code Playgroud)