题目

编写程序,系统比对三种继承方式(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