C++私有继承测试疑问:Student类learnProtected为何可编译?
为什么私有继承后
s2->learnProtected()能编译? 你疑惑的点其实是对C++继承中成员访问权限和继承方式的作用理解出现了小偏差,咱们一步步拆解清楚:
核心规则梳理
先明确两个关键的C++访问控制规则:
- 基类的
protected成员,任何派生类的成员函数都有权访问——不管继承方式是public、protected还是private,这个权限不受继承方式影响。 - 继承方式(
public/protected/private)的核心作用是:修改基类成员在派生类中的对外可见性,以及是否允许派生类对象向上转型为基类指针/引用。
针对你的代码逐一分析
看Student类的定义:
class Student : private Person { public: void learnPublic(){publicInterface();} void learnProtected(){protectedInterface();} void learnPrivate(){privateInterface();} // 确实无法编译 };
s2->learnProtected()的合法性:learnProtected()是Student类自己的public成员函数,外部通过Student* s2调用这个函数完全符合规则——这是在调用派生类对外暴露的public接口,和基类的权限限制无关。- 函数内部调用
protectedInterface()的合法性:因为Student是Person的派生类,不管继承方式是private,派生类的成员函数都能访问基类的protected成员,所以这行代码是合法的,不会触发编译错误。
你之前的预期错误,应该是把「派生类对象直接访问基类的protected成员」和「派生类成员函数访问基类的protected成员」搞混了——如果写s2->protectedInterface(),那肯定无法编译,但s2->learnProtected()是调用派生类自己的public函数,这个函数内部的访问逻辑是被允许的。
另外补充下私有继承的其他影响,帮你理清全貌:
- 私有继承后,基类的
public和protected成员在Student类内部会变成private成员,所以如果Student有子类,子类无法访问这些继承来的成员。 - 私有继承会切断「is-a」关系,所以
Person* s = new Student()无法编译,这部分你的预期是正确的。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

