MST

星途 面试题库

面试题:C++类成员访问属性:访问权限的应用场景

请描述在C++中,public、private和protected访问修饰符分别适用于哪些场景?举例说明在一个简单的图形类继承体系中(例如,基类为Shape,派生类为Circle和Rectangle),如何合理使用这些访问修饰符来保护数据和提供合适的接口。
34.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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

  • 适用场景:介于publicprivate之间,允许派生类访问,但不允许外部代码直接访问。用于保护一些数据或方法,这些数据或方法对于派生类的实现可能是有用的,但不适合外部直接访问。
  • 示例: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绘制圆形的代码
    }
};