使用私有继承的限定名称的行为

Behavior of qualified name using private inheritance

本文关键字:定名称 继承      更新时间:2023-10-16

在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及其基类,在基类中查找Error0,然后访问控制开始生效,因为该名称是private

最简单的修复方法是只写Base::foo(),如果它不是虚拟的,并且您不打算在Derived中写foo(),则甚至只写foo()

如果出于某种原因必须包含模板参数,则编写Base<::Interface>