MST

星途 面试题库

面试题:C++类成员访问属性与继承的关系

定义一个基类`Shape`,具有私有成员`color`,保护成员`area`,公有成员`void setColor(string c)`。再定义一个派生类`Circle`继承自`Shape`,在`Circle`类中有自己的私有成员`radius`,公有成员`void calculateArea()`。在`main`函数中创建`Circle`类对象,分析在`Circle`类的成员函数中对基类不同访问属性成员的访问情况,并解释如何通过合理的设计让派生类能够正确获取和修改基类相关信息。
25.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

以下是使用C++ 实现的代码及相关分析:

#include <iostream>
#include <string>

// 定义基类Shape
class Shape {
private:
    std::string color; // 私有成员
protected:
    double area; // 保护成员
public:
    void setColor(std::string c) {
        color = c;
    }
};

// 定义派生类Circle继承自Shape
class Circle : public Shape {
private:
    double radius; // 私有成员
public:
    void calculateArea() {
        // 在Circle类的成员函数中,无法直接访问基类的私有成员color
        // 可以直接访问基类的保护成员area
        area = 3.14159 * radius * radius;
    }
};

int main() {
    Circle c;
    c.setColor("Red");
    c.radius = 5.0;
    c.calculateArea();
    // 这里无法直接访问c.area,因为area是保护成员
    // 若要在main函数中获取area,可以在Shape类中添加一个公有成员函数来获取area
    return 0;
}

对基类不同访问属性成员的访问情况分析:

  1. 私有成员 (color)
    • 在派生类Circle的成员函数中,无法直接访问基类Shape的私有成员color。这是因为私有成员具有最高的访问限制,仅在其所属类的成员函数内可访问。
  2. 保护成员 (area)
    • 在派生类Circle的成员函数中,可以直接访问基类Shape的保护成员area。保护成员的访问权限介于公有和私有之间,派生类可以访问,但类外(如main函数)无法直接访问。

让派生类能够正确获取和修改基类相关信息的合理设计:

  1. 获取私有成员信息
    • 由于私有成员不能被派生类直接访问,在基类Shape中可以添加一个公有成员函数(如std::string getColor()),用于返回私有成员color的值。这样派生类对象就可以通过调用该公有函数来获取color信息。
  2. 修改私有成员信息
    • 已经在基类Shape中提供了公有成员函数setColor(std::string c)来修改私有成员color,派生类对象可以调用此函数来修改color
  3. 获取保护成员信息
    • 若要在类外(如main函数)获取保护成员area的值,可以在基类Shape中添加一个公有成员函数(如double getArea())来返回area的值。这样在main函数中就可以通过派生类对象调用该公有函数获取area的值。