基类,派生类
在面向对象编程(Object-Oriented Programming, OOP)中,基类与派生类是两个核心概念。基类(Base Class)也被称为父类或超类,它定义了一组通用的方法和属性,为其他类提供了共享行为的基础。派生类(Derived Class)则继承自基类,并可以扩展或修改基类的行为,这被称为继承(Inheritance)。继承是OOP中的多态性(Polymorphism)和代码重用的重要机制。 基类的主要作用是封装一些共同的特性或行为,使得多个类无需重复编写相同代码。在C++中,基类的声明通常包含在头文件(如`classic.h`)中,而实现则在对应的源文件(如`classic.cpp`)中。例如,我们可以创建一个名为`Shape`的基类,它包含一个虚函数`draw()`,用于绘制形状: ```cpp // classic.h class Shape { public: virtual void draw() = 0; // 定义纯虚函数,使Shape成为抽象类 }; ``` 派生类则通过`:`运算符继承基类,并可以选择性地覆盖或添加新的成员。比如,我们可能有`Circle`和`Rectangle`这两个派生类,它们都继承自`Shape`: ```cpp // run.cpp #include "classic.h" class Circle : public Shape { // Circle派生自Shape public: void draw() override { // 实现圆形的绘制逻辑 } }; class Rectangle : public Shape { // Rectangle派生自Shape public: void draw() override { // 实现矩形的绘制逻辑 } }; ``` 这里,`override`关键字确保了我们是故意覆盖基类的`draw()`方法,而非意外地创建一个新的同名函数。派生类可以拥有自己的私有数据成员和方法,同时也可以访问继承自基类的成员。如果基类中某些成员被声明为`protected`,那么它们在派生类中仍然是可访问的。 继承的一个关键特性是多态性,即同一类型的指针或引用可以指向不同类型的实例,只要它们有共同的基类。这种能力在C++中通过虚函数实现。在上面的例子中,我们可以有一个函数接受`Shape`指针的数组,并调用`draw()`,这样无需知道具体是哪个形状,就可以统一处理: ```cpp void drawShapes(Shape* shapes[], int count) { for (int i = 0; i < count; ++i) { shapes[i]->draw(); } } ``` 这个函数可以处理任何类型的`Shape`子类对象,因为每个子类都覆盖了`draw()`方法。这就是动态绑定或运行时多态。 总结来说,基类与派生类是面向对象编程中的重要概念,它们允许代码复用,实现多态性,以及结构化复杂系统。在C++中,通过基类定义通用接口,派生类实现特定功能,可以构建出层次分明、可扩展的软件架构。`classic.cpp`和`run.cpp`文件很可能是实现这些概念的具体示例,展示了如何定义基类和派生类,以及如何通过继承和多态来组织代码。