面试题答案
一键面试以下是使用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;
}
对基类不同访问属性成员的访问情况分析:
- 私有成员 (
color
):- 在派生类
Circle
的成员函数中,无法直接访问基类Shape
的私有成员color
。这是因为私有成员具有最高的访问限制,仅在其所属类的成员函数内可访问。
- 在派生类
- 保护成员 (
area
):- 在派生类
Circle
的成员函数中,可以直接访问基类Shape
的保护成员area
。保护成员的访问权限介于公有和私有之间,派生类可以访问,但类外(如main
函数)无法直接访问。
- 在派生类
让派生类能够正确获取和修改基类相关信息的合理设计:
- 获取私有成员信息:
- 由于私有成员不能被派生类直接访问,在基类
Shape
中可以添加一个公有成员函数(如std::string getColor()
),用于返回私有成员color
的值。这样派生类对象就可以通过调用该公有函数来获取color
信息。
- 由于私有成员不能被派生类直接访问,在基类
- 修改私有成员信息:
- 已经在基类
Shape
中提供了公有成员函数setColor(std::string c)
来修改私有成员color
,派生类对象可以调用此函数来修改color
。
- 已经在基类
- 获取保护成员信息:
- 若要在类外(如
main
函数)获取保护成员area
的值,可以在基类Shape
中添加一个公有成员函数(如double getArea()
)来返回area
的值。这样在main
函数中就可以通过派生类对象调用该公有函数获取area
的值。
- 若要在类外(如