为啥我会得到带有受保护静态成员的 C2248(不可访问成员)?

Posted

技术标签:

【中文标题】为啥我会得到带有受保护静态成员的 C2248(不可访问成员)?【英文标题】:Why do I get C2248 (inaccessible member) with a protected static member?为什么我会得到带有受保护静态成员的 C2248(不可访问成员)? 【发布时间】:2017-03-23 02:13:12 【问题描述】:

假设我有:

#include <Windows.h>
#include <iostream>
#include <vector>

std::vector<int> Base::m_intList;

class Base

public:
    Base();
protected:
    static std::vector<int> m_intList;
;

class Derived : Base

public:
    Derived();
protected:
    bool fWhatever;
;

class MoreDerived : Derived

public:
    MoreDerived();
private:
    HRESULT DoStuff();
;

Base::Base()




Derived::Derived()




MoreDerived::MoreDerived()




HRESULT MoreDerived::DoStuff()

    for (auto it = m_intList.begin(); it != m_intList.end(); it++)
    
        std::cout << *it;
    

当我尝试编译它时,我得到“m_intList:无法访问在类 'MoreDerived' 中声明的不可访问成员”。

问题:为什么我不能在派生类的 DoStuff 函数中访问受保护的静态成员?

【问题讨论】:

Derived 通过private 继承自Base。这是你的意图吗? std::vector&lt;int&gt; Base::m_intList; 是一个错误,因为未声明 Base。请发布给出您所询问的错误的确切代码 【参考方案1】:

class Derived : Base 表示class Derived : private Base。私有继承的行为是:

基类的protected 成员变为派生类的private 成员。 private 基类的成员无权访问作为派生类的成员。

所以m_intList 是:

protectedBase privateDerivedMoreDerived 无权访问

因此你的错误。

【讨论】:

以上是关于为啥我会得到带有受保护静态成员的 C2248(不可访问成员)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能访问静态多态派生类中的受保护成员?

为啥Java中允许受保护的静态? [关闭]

静态成员函数无法访问类的受保护成员

尝试从基类访问受保护的构造函数时获取错误C2248

受保护的静态成员变量

为啥受保护的实例成员在不同包的子类中不可见,但受保护的类成员是? [复制]