MST

星途 面试题库

面试题:C++中不同继承方式对成员访问权限的影响

请阐述C++中公有继承(public)、私有继承(private)和保护继承(protected),这三种继承方式下,基类的公有成员、私有成员和保护成员在派生类中的访问权限分别是怎样的,并举例说明。
27.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

公有继承(public)

  • 基类公有成员:在派生类中仍为公有成员,派生类的成员函数以及通过派生类对象都可以访问。
  • 基类私有成员:在派生类中不可访问,派生类的成员函数和对象都无法直接访问基类的私有成员。
  • 基类保护成员:在派生类中为保护成员,派生类的成员函数可以访问,但通过派生类对象无法访问。

示例

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

class PublicDerived : public Base {
public:
    void accessMembers() {
        public_member = 10;
        // private_member = 20;  // 错误,无法访问
        protected_member = 30;
    }
};

int main() {
    PublicDerived obj;
    obj.public_member = 40;
    // obj.private_member = 50;  // 错误,无法访问
    // obj.protected_member = 60;  // 错误,无法访问
    return 0;
}

私有继承(private)

  • 基类公有成员:在派生类中变为私有成员,派生类的成员函数可以访问,但通过派生类对象无法访问。
  • 基类私有成员:在派生类中不可访问,派生类的成员函数和对象都无法直接访问基类的私有成员。
  • 基类保护成员:在派生类中变为私有成员,派生类的成员函数可以访问,但通过派生类对象无法访问。

示例

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

class PrivateDerived : private Base {
public:
    void accessMembers() {
        public_member = 10;
        // private_member = 20;  // 错误,无法访问
        protected_member = 30;
    }
};

int main() {
    PrivateDerived obj;
    // obj.public_member = 40;  // 错误,无法访问
    // obj.private_member = 50;  // 错误,无法访问
    // obj.protected_member = 60;  // 错误,无法访问
    return 0;
}

保护继承(protected)

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

示例

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

class ProtectedDerived : protected Base {
public:
    void accessMembers() {
        public_member = 10;
        // private_member = 20;  // 错误,无法访问
        protected_member = 30;
    }
};

int main() {
    ProtectedDerived obj;
    // obj.public_member = 40;  // 错误,无法访问
    // obj.private_member = 50;  // 错误,无法访问
    // obj.protected_member = 60;  // 错误,无法访问
    return 0;
}