MST

星途 面试题库

面试题:C++中不同继承方式下基类成员访问规则

请详细阐述C++中公有继承(public)、私有继承(private)、保护继承(protected)三种继承方式下,基类的公有成员、私有成员、保护成员在派生类中的访问权限变化,并各举一个简单代码示例说明。
26.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

公有继承(public)

  • 基类公有成员:在派生类中仍为公有成员,派生类对象可以访问,派生类的成员函数也可以访问。
  • 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
  • 基类保护成员:在派生类中变为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class PublicDerived : public Base {
public:
    void display() {
        std::cout << "Public member: " << public_member << std::endl;
        std::cout << "Protected member: " << protected_member << std::endl;
        // std::cout << "Private member: " << private_member << std::endl;  // 编译错误
    }
};

int main() {
    PublicDerived pd;
    pd.public_member = 10;
    pd.display();
    // pd.protected_member = 20;  // 编译错误
    // pd.private_member = 30;  // 编译错误
    return 0;
}

私有继承(private)

  • 基类公有成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
  • 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
  • 基类保护成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class PrivateDerived : private Base {
public:
    void display() {
        std::cout << "Public member: " << public_member << std::endl;
        std::cout << "Protected member: " << protected_member << std::endl;
        // std::cout << "Private member: " << private_member << std::endl;  // 编译错误
    }
};

int main() {
    PrivateDerived pd;
    // pd.public_member = 10;  // 编译错误
    pd.display();
    // pd.protected_member = 20;  // 编译错误
    // pd.private_member = 30;  // 编译错误
    return 0;
}

保护继承(protected)

  • 基类公有成员:在派生类中变为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
  • 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
  • 基类保护成员:在派生类中仍为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class ProtectedDerived : protected Base {
public:
    void display() {
        std::cout << "Public member: " << public_member << std::endl;
        std::cout << "Protected member: " << protected_member << std::endl;
        // std::cout << "Private member: " << private_member << std::endl;  // 编译错误
    }
};

int main() {
    ProtectedDerived pd;
    // pd.public_member = 10;  // 编译错误
    pd.display();
    // pd.protected_member = 20;  // 编译错误
    // pd.private_member = 30;  // 编译错误
    return 0;
}