MST

星途 面试题库

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

在C++类继承体系中,有公有继承(public)、保护继承(protected)和私有继承(private)三种方式。请详细阐述这三种继承方式下,基类成员(公有、保护、私有)在派生类中的访问权限变化情况,并举例说明。
16.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

公有继承(public)

  1. 基类公有成员:在派生类中仍为公有成员,派生类对象可以访问,派生类的成员函数也可以访问。
  2. 基类保护成员:在派生类中仍为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
  3. 基类私有成员:在派生类中不可访问,无论是派生类对象还是派生类的成员函数都无法直接访问。

示例代码:

class Base {
public:
    int publicData;
protected:
    int protectedData;
private:
    int privateData;
};

class PublicDerived : public Base {
public:
    void accessMembers() {
        publicData = 10;
        protectedData = 20;
        // privateData = 30; // 编译错误,无法访问基类私有成员
    }
};

int main() {
    PublicDerived obj;
    obj.publicData = 100;
    // obj.protectedData = 200; // 编译错误,派生类对象无法访问保护成员
    return 0;
}

保护继承(protected)

  1. 基类公有成员:在派生类中变为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
  2. 基类保护成员:在派生类中仍为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
  3. 基类私有成员:在派生类中不可访问,无论是派生类对象还是派生类的成员函数都无法直接访问。

示例代码:

class Base {
public:
    int publicData;
protected:
    int protectedData;
private:
    int privateData;
};

class ProtectedDerived : protected Base {
public:
    void accessMembers() {
        publicData = 10;
        protectedData = 20;
        // privateData = 30; // 编译错误,无法访问基类私有成员
    }
};

int main() {
    ProtectedDerived obj;
    // obj.publicData = 100; // 编译错误,派生类对象无法访问保护成员
    // obj.protectedData = 200; // 编译错误,派生类对象无法访问保护成员
    return 0;
}

私有继承(private)

  1. 基类公有成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
  2. 基类保护成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
  3. 基类私有成员:在派生类中不可访问,无论是派生类对象还是派生类的成员函数都无法直接访问。

示例代码:

class Base {
public:
    int publicData;
protected:
    int protectedData;
private:
    int privateData;
};

class PrivateDerived : private Base {
public:
    void accessMembers() {
        publicData = 10;
        protectedData = 20;
        // privateData = 30; // 编译错误,无法访问基类私有成员
    }
};

int main() {
    PrivateDerived obj;
    // obj.publicData = 100; // 编译错误,派生类对象无法访问私有成员
    // obj.protectedData = 200; // 编译错误,派生类对象无法访问私有成员
    return 0;
}