我正在尝试测试我的类的受保护方法和构造函数。为此,我尝试对其进行子类化,并使用 C++11 将其成员重新导出为 publicusing
关键词:
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();
}
然而,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);
^
TestableFoo 构造函数仍然受到保护,即使run
方法公开(我单独确认)。为什么会这样?我可以理解任一决定(继承与覆盖可见性),但为什么方法和构造函数之间存在不一致?
标准明确规定继承的构造函数保留其访问级别:
12.9 继承构造函数[class.inhctor]
1 隐式命名构造函数的 using 声明 (7.3.3)
声明一组继承构造函数。候选集为
从类继承的构造函数X
在 using 声明中命名
由实际构造函数和概念构造函数组成
由默认参数变换如下:
[案例列表略]
4 如此声明的构造函数与相应的构造函数具有相同的访问权限
X 中的构造函数。如果对应的构造函数在X
被删除(8.4)。
当然你可以直接调用它:
TestableFoo(int i) : Foo(i) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)