使用私有继承的限定名称的行为
Behavior of qualified name using private inheritance
在msvc中编译以下示例时,我得到
"Interface"不可访问,因为"Base"使用"private"从"接口"继承
在用CCD_ 1标记的行中。当使用相同类型的类型别名限定对foo
的调用时,它就工作了。我用msvc和ideone进行了测试。
为什么这两个电话不相等?
struct Interface {};
template<class T>
struct Base : private T
{
void foo() {}
};
using BaseX = Base<Interface>;
class Derived : Base<Interface>
{
Derived() {
Base<Interface>::foo(); // Error
BaseX::foo(); // Works
}
};
Ideone
注入的类名。
名称Interface
被注入到类Interface
的作用域中,就好像它是公共成员一样,然后由Base<Interface>
继承(作为私有成员,因为您使用的是私有继承)。
当您在Derived
中写入Base<Interface>::foo()
时,Interface
的非限定名称查找首先查找Derived
及其基类,在基类中查找Error
0,然后访问控制开始生效,因为该名称是private
。
最简单的修复方法是只写Base::foo()
,如果它不是虚拟的,并且您不打算在Derived
中写foo()
,则甚至只写foo()
。
如果出于某种原因必须包含模板参数,则编写Base<::Interface>
。
相关文章:
- 名称隐藏对静态函数继承的实例使用
- enable_if继承的成员函数的名称查找错误
- C++继承和相同的功能名称
- 具有相同名称的类的构造函数继承
- 如何解决多次继承的不明确变量名称?
- 名称空间从C 中的Include File继承
- 变量(继承自基模板类)的偏移量,由具有相同名称的成员遮蔽
- C++中名称查找和名称绑定之间的区别
- 继承和嵌套名称的陷阱
- C++多重继承 - 相同的方法名称 - 我可以以某种方式删除其中一个吗?
- C 预期的类名称{token,一个继承错误
- 具有相同名称成员的基类的C++多重继承
- 从子类访问私有继承类的名称
- C 中的继承和名称空间
- 结构绑定:与公共数据成员(继承的基类)结合
- 如何使用继承定义父类的函数
- C++私有变量名称和继承歧义
- 运行时动态绑定和类继承之间的区别
- 当我们想要私下继承基类时,为什么要进行名称公开
- 模板类继承命名空间的名称查找