本文介绍了派生类的声明以及在C++中的应用,重点在于理解派生类的概念、继承方式以及派生类对基类的扩充。派生类是面向对象编程中的一个重要概念,允许我们基于已有的类(基类)创建新的类(派生类),实现软件复用和代码的模块化。
### 一、派生类的声明
派生类的声明通常采用以下格式:
```cpp
class 派生类名:派生方式 基类名
{
派生类中的新成员
}
```
这里的派生方式可以是`public`、`protected`或`private`,分别代表公有继承、保护继承和私有继承。默认情况下,如果未指定派生方式,C++会认为是私有继承。不同的继承方式决定了基类成员在派生类中的可见性和访问权限。
### 二、继承方式的作用
1. **公有继承 (public)**:基类的公有成员和保护成员在派生类中仍然是公有和保护的,派生类的对象可以直接访问它们。这有助于实现"is-a"关系,例如,"狗 is a 动物"。
2. **私有继承 (private)**:基类的所有成员在派生类中变为私有,派生类的外部无法直接访问,仅限于派生类内部使用。这通常用于实现"has-a"关系,例如,"汽车 has a 引擎"。
3. **保护继承 (protected)**:基类的公有和保护成员在派生类中变为保护成员,只有派生类及其子类可以访问。这提供了一种介于公有和私有继承之间的选择,限制了对基类成员的访问,但比私有继承更为灵活。
### 三、派生类的扩充
派生类不仅可以继承基类的成员,还可以添加新的数据成员、成员函数,甚至重定义基类的已有成员。这种机制允许我们在不改变基类原有功能的基础上,扩展或修改基类的行为,以满足特定的需求。
1. **增加新的数据成员**:派生类可以包含基类没有的额外数据,以增强其功能。
2. **增加新的成员函数**:可以添加新的操作或行为,这些在基类中可能不存在。
3. **重定义已有成员函数**:通过覆盖(override)基类的虚函数,派生类可以实现不同的行为,这是多态性的重要体现。
### 四、程序示例
以下是一个简单的例子,展示了派生类如何实现对象复用和继承:
```cpp
// 点类
class Point
{
private:
int x, y;
public:
Point(int xx = 0, int yy = 0) { x = xx; y = yy; }
void show_point() { cout << x << "\t" << y << endl; }
};
// 圆类,继承自点类
class Circle : public Point
{
private:
int r;
public:
Circle(int xx, int yy, int rr) : Point(xx, yy) { r = rr; }
void show_circle() {
show_point(); // 调用基类的函数
cout << r << endl;
}
};
int main() {
Circle c(5, 10, 20);
c.show_circle();
}
```
在这个例子中,`Circle`类通过`public`继承自`Point`类,实现了"圆 is a 点"的关系,并增加了表示半径的成员变量`r`和显示圆的相关函数。
通过这种方式,派生类不仅能够复用基类的代码,还能根据需要进行扩展,实现更复杂的功能。这种继承机制使得代码结构更加清晰,提高了代码的可维护性和重用性。