为什么clang不允许派生类调用受保护的基函数?

时间:2016-09-16 09:36:20

标签: c++ templates compiler-errors clang

template<int N>
struct B
{
protected:
    void f() {} 
};

template<int N>
struct A : B<N> 
{
    A()
    {
        this->f(); // ok
        f(); // error : use of undeclared identifier 'f'
    }
};

int main()
{
    A<8> a;
}

我的C ++编译器是clang 3.8。

为什么clang不允许派生类调用受保护的基函数?

1 个答案:

答案 0 :(得分:-3)

这不是特定于clang而是C ++访问控制和protected访问说明符。

语言规范要确保您正在访问属于派生类对象的某个基本子对象的受保护成员。您不应该能够访问某些不相关的基类型独立对象的受保护成员。

因此,您必须通过pointer->member语法,reference.memberobject.member语法访问受保护的成员,其中指针/引用/对象引用派生类。

这与您在示例中显示的内容完全一致:

template<int N>
struct B
{
protected:
    void f() {} 
};

template<int N>
struct A : B<N> 
{
    A()
    {
        this->f(); // ok
        f(); // error : use of undeclared identifier 'f'
    }
};

Link: 受保护的成员不像私有成员那样私有,只能由声明它们的类的成员访问,但它们不像公共成员那样公开,可以在任何函数中访问。

只有通过指向派生类的引用,引用或对象,派生类中的朋友和成员函数才能访问未声明为静态的受保护成员。