能,但仅限基类中public成员且必须public继承;protected/private成员无论继承方式如何,派生类对象均不可访问,因访问控制限制对象实例调用。

能,但只限于基类中 public 成员,且继承方式必须是 public。其他情况会编译失败或不可见。
public 继承下,派生类对象能访问哪些基类成员
只有基类中原本就是 public 的成员,且通过 public 方式继承时,才能被派生类对象直接调用。
-
Base::func()是public,class Derived : public Base→Derived obj; obj.func();合法 -
Base::func()是protected或private→ 即使public继承,对象也不能调用 -
Base::func()是public,但class Derived : private Base→ 对象无法访问,因为继承后变成private成员
为什么 protected/private 成员不能被派生类对象调用
这是访问控制的层级设计:保护成员只允许“本类 + 派生类内部”访问,不开放给“对象实例”;私有成员连派生类内部都不能访问。
-
protected成员可在Derived的成员函数里调用(如this->m_protected),但Derived obj; obj.m_protected;报错 -
private成员在派生类中语法上完全不可见,哪怕写Base::m_private也会被拒绝 - 想让派生类外部也能访问某个基类功能,只能把它设为
public,或提供public的接口函数
常见错误:误以为“继承了就能用”,结果编译报错
典型错误信息包括:error: 'xxx' is inaccessible、error: 'xxx' is a private member of 'Base'、error: 'xxx' is protected within this context。
立即学习“C++免费学习笔记(深入)”;
- 检查基类中该成员的原始访问限定符(
public/protected/private) - 检查继承方式(
public/protected/private),二者共同决定最终可见性 - 别依赖 IDE 自动补全——它可能显示基类成员,但实际调用仍非法
最易忽略的一点:基类 private 成员虽然“不可见”,但它仍然存在于派生类对象内存布局中;只是语言层面禁止任何直接或间接访问路径——连 sizeof(Derived) 都可能包含它。


















