用cpp建立一个合适的继承体系shape类,测试 public 继承下的基类不同访问权限的派生类调用
时间: 2024-10-17 07:14:42 浏览: 26
表面积和体积_抽象类Shape_shape类继承_
在C++中,我们可以创建一个`Shape`基类,然后通过public继承让派生类如`Circle`, `Rectangle`和`Square`访问基类的不同成员。这里是一个简单的例子:
```cpp
#include <iostream>
// 定义基类 Shape,有 protected 和 public 成员变量及方法
class Shape {
protected:
double width; // protected 变量
std::string name;
public:
// 构造函数和 getter/setter
Shape(double w, std::string n) : width(w), name(n) {}
double getWidth() const { return width; }
std::string getName() const { return name; }
// 公共虚函数,用于演示多态
virtual void draw() const {
std::cout << "Drawing a " << name << " shape" << std::endl;
}
};
// 派生类 Circle,从 Shape 公开继承
class Circle : public Shape {
public:
Circle(double r, std::string n = "") : Shape(r * 2, n) {} // 子类可以有自己的构造函数
// 重写基类的 draw() 函数,展示访问权限的影响
void draw() const override {
std::cout << "Drawing a circle with radius: " << getWidth() / 2 << std::endl;
}
};
// 另一个派生类 Rectangle,也是公开继承 Shape
class Rectangle : public Shape {
public:
Rectangle(double w, double h, std::string n = "") : Shape(std::max(w, h), n) {}
// 重写 draw() 函数
void draw() const override {
std::cout << "Drawing a rectangle with dimensions: " << getWidth() << " x " << getHeight() << std::endl;
}
private:
double height; // 私有变量,仅在本类内访问
// getters and setters for height are not shown here
};
int main() {
Circle circle(5, "blue");
circle.draw(); // 正常输出,因为是公开继承,派生类可以访问基类的公有成员
Rectangle rect(4, 6, "red");
rect.draw(); // 也可以正常输出,同理
Shape* shapes[2] = {&circle, &rect};
for (auto shape : shapes) {
shape->draw(); // 尽管指针指向的是基类,但仍然可以调用派生类的 draw() 实现
}
return 0;
}
阅读全文