MST

星途 面试题库

面试题:C++访问控制与继承中的细节

在C++的继承体系中,当基类的成员具有不同的访问控制属性(public、private、protected),且以public、private、protected三种不同方式继承时,派生类对基类成员的访问权限会发生怎样的变化?请详细说明每种情况,并解释为什么会有这样的变化。
32.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 以public方式继承

  • 基类public成员:在派生类中仍然是public成员。这是因为public继承意味着“是一个”的关系,派生类对象应该具有与基类对象相同的对外接口,所以基类的public成员在派生类中保持其public属性,这样派生类对象可以像基类对象一样直接访问这些成员。
  • 基类protected成员:在派生类中变为protected成员。protected成员对于基类自身和派生类是可见的,但对于外部代码不可见。在public继承下,为了保证派生类内部可以访问这些成员,同时又限制外部代码的访问,所以将其变为protected。
  • 基类private成员:在派生类中不可访问。private成员是基类的内部实现细节,即使通过继承,派生类也不应该直接访问基类的private成员,这符合封装的原则,保证了基类的实现细节对派生类的隐藏。

2. 以private方式继承

  • 基类public成员:在派生类中变为private成员。private继承表示派生类只是使用了基类的实现,而不是“是一个”基类对象。将基类的public成员变为private,使得这些成员只能在派生类内部访问,外部代码无法访问,这有助于隐藏基类的接口,仅让派生类自己使用基类的功能。
  • 基类protected成员:在派生类中变为private成员。同样,为了将基类的实现细节限制在派生类内部,protected成员也变为private,派生类内部可以访问,但外部无法访问。
  • 基类private成员:在派生类中不可访问。原因同public继承,private成员是基类的私有实现,不应该被派生类直接访问。

3. 以protected方式继承

  • 基类public成员:在派生类中变为protected成员。protected继承介于public和private继承之间,它表示派生类对象不是完全与基类对象有相同的对外接口,但派生类及其派生类可以访问这些成员。所以将基类public成员变为protected,使得这些成员对于派生类及其派生类可见,而对外部代码不可见。
  • 基类protected成员:在派生类中仍然是protected成员。保持其protected属性,确保派生类及其派生类可以访问这些成员,同时限制外部代码的访问。
  • 基类private成员:在派生类中不可访问。理由与上述两种继承方式相同,private成员是基类的私有实现,不能被派生类直接访问。