MST

星途 面试题库

面试题:C++ 中类的继承与访问权限问题

假设有一个基类 Base,包含一个私有成员变量 `privateVar`,一个保护成员变量 `protectedVar` 和一个公有成员函数 `publicFunc`。现在定义一个派生类 Derived 继承自 Base。请说明在 Derived 类中能否直接访问 `privateVar`、`protectedVar` 和 `publicFunc`,并阐述原因。如果不能直接访问 `privateVar`,请给出一种在 Derived 类中访问 `privateVar` 的合理方法(不破坏封装性原则)。
32.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. Derived 类中对各成员的访问情况及原因
    • privateVar
      • 能否直接访问:不能直接访问。
      • 原因:私有成员变量的访问权限仅限于其所属的类内部。在派生类 Derived 中,虽然继承自 Base,但 privateVar 仍然属于 Base 类的私有成员,对派生类不可见,这是为了保证类的封装性,防止外部(包括派生类)随意访问和修改私有数据。
    • protectedVar
      • 能否直接访问:能直接访问。
      • 原因:保护成员变量的访问权限介于公有和私有之间,对于派生类来说,它可以直接访问从基类继承而来的保护成员变量。这样既保证了在类层次结构内部的访问灵活性,又避免了对外公开这些成员,维持了一定的封装性。
    • publicFunc
      • 能否直接访问:能直接访问。
      • 原因:公有成员函数的访问权限是公开的,派生类可以继承并直接访问基类的公有成员函数,这是类继承体系中实现代码复用和功能扩展的基础。
  2. Derived 类中访问 privateVar 的合理方法
    • 可以在 Base 类中提供一个公有或保护的成员函数,用于获取或修改 privateVar。例如:
class Base {
private:
    int privateVar;
public:
    int getPrivateVar() const {
        return privateVar;
    }
    void setPrivateVar(int value) {
        privateVar = value;
    }
protected:
    // 也可以提供保护的访问函数,如果希望派生类有更灵活的操作但又不完全公开
    int getPrivateVarProtected() const {
        return privateVar;
    }
    void setPrivateVarProtected(int value) {
        privateVar = value;
    }
};

class Derived : public Base {
public:
    void accessPrivateVar() {
        // 通过公有函数访问
        int value = getPrivateVar();
        // 通过保护函数访问
        int value2 = getPrivateVarProtected();
    }
};
  • 通过这种方式,在不破坏封装性原则的前提下,派生类 Derived 可以间接访问 Base 类的私有成员变量 privateVar。因为访问是通过 Base 类自身提供的接口进行的,外部(包括派生类)不能绕过这些接口直接操作 privateVar,从而保证了数据的安全性和封装性。