public
- 适用场景:用于定义类的外部接口,类的使用者可以直接访问这些成员。通常是一些操作数据成员的方法,使得外部代码能够与类进行交互。
- 示例:在图形类继承体系中,Shape类可能有一个
draw
方法,它是供外部调用以绘制图形的,应定义为public
。
class Shape {
public:
virtual void draw() const = 0; // 纯虚函数,供外部调用绘制图形
};
class Circle : public Shape {
public:
void draw() const override {
// 绘制圆形的代码
}
};
class Rectangle : public Shape {
public:
void draw() const override {
// 绘制矩形的代码
}
};
private
- 适用场景:用于保护类的内部数据成员,防止外部代码直接访问和修改,确保数据的安全性和一致性。只有类的成员函数可以访问
private
成员。
- 示例:在Circle类中,圆的半径
radius
是其内部状态,不应被外部直接访问,应定义为private
。
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() const override {
// 使用radius绘制圆形的代码
}
};
protected
- 适用场景:介于
public
和private
之间,允许派生类访问,但不允许外部代码直接访问。用于保护一些数据或方法,这些数据或方法对于派生类的实现可能是有用的,但不适合外部直接访问。
- 示例:Shape类可能有一个
setColor
方法,它用于设置图形的颜色,这个方法对于派生类(如Circle和Rectangle)设置自身颜色是有用的,但对于外部代码可能不需要直接调用,可定义为protected
。
class Shape {
protected:
void setColor(const std::string& color) {
this->color = color;
}
private:
std::string color;
public:
virtual void draw() const = 0;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() const override {
setColor("red"); // 派生类可以调用protected方法
// 使用radius和color绘制圆形的代码
}
};