MST

星途 面试题库

面试题:C++ 中类继承与派生的访问控制

在 C++ 中,当一个类派生自另一个类时,有 public、private 和 protected 三种继承方式。请解释这三种继承方式下,基类成员在派生类中的访问权限有何不同,并举例说明。
34.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. public 继承

  • 访问权限:基类的 public 成员在派生类中仍是 public 的,protected 成员在派生类中仍是 protected 的,private 成员在派生类中不可访问。
  • 示例代码
class Base {
public:
    int publicData;
protected:
    int protectedData;
private:
    int privateData;
};

class PublicDerived : public Base {
public:
    void accessMembers() {
        publicData = 10; // 正确,public 成员在派生类中可访问
        protectedData = 20; // 正确,protected 成员在派生类中可访问
        // privateData = 30; // 错误,private 成员在派生类中不可访问
    }
};

2. private 继承

  • 访问权限:基类的 public 和 protected 成员在派生类中都变成 private 的,private 成员在派生类中不可访问。
  • 示例代码
class PrivateDerived : private Base {
public:
    void accessMembers() {
        publicData = 10; // 正确,虽然基类 public 成员在派生类变为 private,但在类内可访问
        protectedData = 20; // 正确,基类 protected 成员在派生类变为 private,在类内可访问
        // privateData = 30; // 错误,private 成员在派生类中不可访问
    }
};

// 在类外使用 PrivateDerived
// PrivateDerived pd;
// pd.publicData = 10; // 错误,public 成员在派生类中变为 private,类外不可访问

3. protected 继承

  • 访问权限:基类的 public 和 protected 成员在派生类中都变成 protected 的,private 成员在派生类中不可访问。
  • 示例代码
class ProtectedDerived : protected Base {
public:
    void accessMembers() {
        publicData = 10; // 正确,基类 public 成员在派生类变为 protected,在类内可访问
        protectedData = 20; // 正确,基类 protected 成员在派生类仍为 protected,在类内可访问
        // privateData = 30; // 错误,private 成员在派生类中不可访问
    }
};

class FurtherDerived : public ProtectedDerived {
public:
    void accessMembers() {
        publicData = 10; // 正确,基类 public 成员经 protected 继承后在 FurtherDerived 中是 protected 的,在类内可访问
        protectedData = 20; // 正确,基类 protected 成员经 protected 继承后在 FurtherDerived 中是 protected 的,在类内可访问
    }
};