MST

星途 面试题库

面试题:C++类成员访问属性:继承与访问权限变化

在C++中,当一个类从另一个类继承时,不同的继承方式(public、private、protected继承)会如何影响基类成员在派生类中的访问属性?请详细阐述,并编写代码示例展示每种继承方式下,基类的public、private和protected成员在派生类以及通过派生类对象访问的情况。
17.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 不同继承方式对基类成员访问属性的影响

  • public继承
    • 基类的public成员在派生类中仍然是public的,可以被派生类对象和其他外部代码访问。
    • 基类的protected成员在派生类中仍然是protected的,只能被派生类及其派生类的成员函数访问。
    • 基类的private成员在派生类中不可访问,即使是派生类的成员函数也不能直接访问。
  • private继承
    • 基类的public成员在派生类中变为private的,只能被派生类的成员函数访问,外部代码无法通过派生类对象访问。
    • 基类的protected成员在派生类中同样变为private的,只能被派生类的成员函数访问。
    • 基类的private成员在派生类中不可访问。
  • protected继承
    • 基类的public成员在派生类中变为protected的,只能被派生类及其派生类的成员函数访问,不能被外部代码通过派生类对象访问。
    • 基类的protected成员在派生类中仍然是protected的,访问权限不变。
    • 基类的private成员在派生类中不可访问。

2. 代码示例

#include <iostream>

// 基类
class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;

public:
    Base() : public_member(1), protected_member(2), private_member(3) {}
};

// public继承
class PublicDerived : public Base {
public:
    void display() {
        std::cout << "PublicDerived: public_member = " << public_member << std::endl;
        std::cout << "PublicDerived: protected_member = " << protected_member << std::endl;
        // 下面这行代码会报错,因为private_member在派生类中不可访问
        // std::cout << "PublicDerived: private_member = " << private_member << std::endl;
    }
};

// private继承
class PrivateDerived : private Base {
public:
    void display() {
        std::cout << "PrivateDerived: public_member = " << public_member << std::endl;
        std::cout << "PrivateDerived: protected_member = " << protected_member << std::endl;
        // 下面这行代码会报错,因为private_member在派生类中不可访问
        // std::cout << "PrivateDerived: private_member = " << private_member << std::endl;
    }
};

// protected继承
class ProtectedDerived : protected Base {
public:
    void display() {
        std::cout << "ProtectedDerived: public_member = " << public_member << std::endl;
        std::cout << "ProtectedDerived: protected_member = " << protected_member << std::endl;
        // 下面这行代码会报错,因为private_member在派生类中不可访问
        // std::cout << "ProtectedDerived: private_member = " << private_member << std::endl;
    }
};

int main() {
    PublicDerived public_obj;
    public_obj.display();
    // 可以通过public_obj访问public_member,因为public继承使public_member在派生类中仍是public
    std::cout << "Outside PublicDerived: public_member = " << public_obj.public_member << std::endl; 

    PrivateDerived private_obj;
    private_obj.display();
    // 下面这行代码会报错,因为private继承使public_member在派生类中变为private,外部无法访问
    // std::cout << "Outside PrivateDerived: public_member = " << private_obj.public_member << std::endl; 

    ProtectedDerived protected_obj;
    protected_obj.display();
    // 下面这行代码会报错,因为protected继承使public_member在派生类中变为protected,外部无法访问
    // std::cout << "Outside ProtectedDerived: public_member = " << protected_obj.public_member << std::endl; 

    return 0;
}

在上述代码中:

  • PublicDerived类以public方式继承Base类,public_memberPublicDerived类中仍为public,可被外部访问,protected_memberprotected,只能在PublicDerived类及其派生类中访问,private_member不可访问。
  • PrivateDerived类以private方式继承Base类,public_memberprotected_memberPrivateDerived类中都变为private,只能在PrivateDerived类内部访问,private_member不可访问。
  • ProtectedDerived类以protected方式继承Base类,public_memberProtectedDerived类中变为protectedprotected_member仍为protected,都只能在ProtectedDerived类及其派生类中访问,private_member不可访问。同时通过main函数展示了不同继承方式下通过派生类对象访问成员的情况。