大鱼会飞 2015-08-18 09:53 采纳率: 0%
浏览 1960

字样的继承关系,为什么会提示:无法访问 protected 成员

#include

using namespace std;

template
class B1
{
public:
void SayHi()
{
T* pT = static_cast(this);

pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1"; }
};

class D1 : public B1
{
// No overridden functions at all
};

class D2 : public B1
{
protected:
void PrintClassName() { cout << "This is D2"; }
};

int main()
{
D1 d1;
D2 d2;

d1.SayHi();    // prints "This is B1"
d2.SayHi();    // prints "This is D2"

return 0;

}

编译错误:error C2248: “D2::PrintClassName”: 无法访问 protected 成员(在“D2”类中声明)

  • 写回答

2条回答 默认 最新

  • 91program 博客专家认证 2015-08-18 10:03
    关注

    D2 中定义的 PrintClassName,屏蔽了基类中同名的函数。
    你在 D2 中又没有实现类似于 B1 中的 SayHi,想直接访问 D2 类中的保护成员 PrintClassName 是不行的。

    因为:protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
    但不能被该类的对象访问。

    评论

报告相同问题?

悬赏问题

  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了