题目
编写程序,系统比对三种继承方式(public 公有继承、protected 保护继承、private 私有继承)对基类的 public、protected、private 成员在派生类内部与外部对象使用时的访问权限降级规则矩阵。演示私有继承(实现继承而非接口继承)在外部阻断多态向上转型的语法限制。
输入格式:无需外部输入。
输出格式:输出继承权限控制下派生类访问权限的编译与运行测试说明。
数据范围与约定:OOP 访问控制、三种继承模式对成员访问标号的降级矩阵。
思路与算法
1. 权限取交集收缩法则
派生后的访问权限是“成员原访问修饰”与“继承方式”两者的最严格收敛(公有保留不变,保护继承降级为 protected,私有继承降级为 private)。基类的 private 成员在派生类中永远不可见。
2. is-a 与 has-a 关系public 继承代表“is-a”关系(子类是一个父类,支持多态向上转型);private 继承代表“has-a”内部实现复用(子类用父类实现,外部无法把子类当作父类指针使用)。
3. 工程实践
现代 C++ 99% 的面向对象业务使用 public 继承;组合(Composition)优先于私有继承。
完整程序
#include <iostream>
class Base {
public:
int pubVal{1};
protected:
int proVal{2};
private:
int priVal{3};
};
// 1. 公有继承:基类访问属性原封不动保持
class PubDerived : public Base {
public:
void testAccess() {
std::cout << "[公有继承派生类内] pubVal: " << pubVal << ", proVal: " << proVal << "\n";
// priVal 无法访问
}
};
// 2. 保护继承:基类的 public 与 protected 在子类内全部降为 protected
class ProDerived : protected Base {
public:
void testAccess() {
std::cout << "[保护继承派生类内] pub 降为 pro: " << pubVal << ", pro: " << proVal << "\n";
}
};
// 3. 私有继承:基类所有可见成员在子类内全部降为 private
class PriDerived : private Base {
public:
void testAccess() {
std::cout << "[私有继承派生类内] 全部降为 private: " << pubVal << "\n";
}
};
int main() {
PubDerived pubObj;
pubObj.testAccess();
std::cout << "[外部访问] pubObj.pubVal = " << pubObj.pubVal << "\n\n";
ProDerived proObj;
proObj.testAccess();
// proObj.pubVal 外部无法访问(已降级为 protected)
PriDerived priObj;
priObj.testAccess();
// priObj.pubVal 外部无法访问(已降级为 private)
// 多态向上转型验证
Base* pBase = &pubObj; // 公有继承允许安全向上转型
std::cout << "公有继承成功向上转换为 Base* 指针,读得 pubVal = " << pBase->pubVal << "\n";
return 0;
}运行示例
输出:
[公有继承派生类内] pubVal: 1, proVal: 2
[外部访问] pubObj.pubVal = 1
[保护继承派生类内] pub 降为 pro: 1, pro: 2
[私有继承派生类内] 全部降为 private: 1
公有继承成功向上转换为 Base* 指针,读得 pubVal = 1