派生类

197 阅读3分钟

在面向对象编程中,派生类(也称为子类或继承类)是从一个或多个基类(也称为父类或超类)继承属性和方法的类。这种继承机制允许新的类复用现有类的代码,从而提高了代码的重用性和可维护性。

一、定义与特点

  1. 定义:派生类是通过继承基类而创建的类。它继承了基类的所有公有和保护成员(除非在派生类中被重写或隐藏),并可以添加新的成员。
  2. 特点
    • 继承性:派生类可以继承基类的属性和方法。
    • 多态性:通过虚函数机制,派生类可以重写基类中的虚函数,从而实现多态性。
    • 封装性:派生类可以隐藏或保护基类的某些成员,同时添加新的封装特性。

二、继承方式

在C++等语言中,继承方式决定了基类成员在派生类中的访问权限。常见的继承方式有:

  1. 公有继承(public inheritance):基类的公有成员和保护成员在派生类中仍然是公有和保护成员,基类的私有成员在派生类中仍然是私有的。
  2. 保护继承(protected inheritance):基类的公有成员和保护成员在派生类中变为保护成员,基类的私有成员在派生类中仍然是私有的。
  3. 私有继承(private inheritance):基类的公有成员和保护成员在派生类中变为私有成员,基类的私有成员在派生类中仍然是私有的。

三、构造函数与析构函数

  1. 构造函数:派生类有自己的构造函数,用于初始化派生类新增的数据成员。在创建派生类对象时,会首先调用基类的构造函数来初始化基类部分的数据成员。
  2. 析构函数:派生类通常也需要定义自己的析构函数,用于清理派生类新增的资源。在销毁派生类对象时,会首先调用派生类的析构函数,然后再调用基类的析构函数来清理基类部分的资源。

四、重写与隐藏

  1. 重写(Override):派生类可以重写基类中的虚函数。重写后的函数在派生类中具有相同的函数签名和返回类型(在C++11及更高版本中,可以使用override关键字来显式指明重写)。
  2. 隐藏(Hide):如果派生类中定义了一个与基类中的非虚函数同名的函数,则该函数会隐藏基类中的同名函数。隐藏不同于重写,因为它不会改变基类函数的行为,只是在派生类作用域内提供了一个新的函数实现。

五、示例代码

以下是一个简单的C++示例代码,展示了派生类的定义和使用:

#include <iostream>

class Base {
public:
    Base() { std::cout << "Base constructor" << std::endl; }
    virtual ~Base() { std::cout << "Base destructor" << std::endl; }
    virtual void show() { std::cout << "Base show()" << std::endl; }
};

class Derived : public Base {
public:
    Derived() { std::cout << "Derived constructor" << std::endl; }
    ~Derived() { std::cout << "Derived destructor" << std::endl; }
    void show() override { std::cout << "Derived show()" << std::endl; }
};

int main() {
    Derived d;
    d.show(); // 输出: Derived show()
    return 0;
} // 程序结束时,输出: Derived destructor, Base destructor

在这个示例中,Derived类从Base类公有继承,并重写了show()虚函数。在创建Derived对象时,会先调用Base类的构造函数,然后调用Derived类的构造函数。在销毁对象时,会先调用Derived类的析构函数,然后调用Base类的析构函数。通过基类指针调用show()函数时,会表现出多态性,即调用的是派生类中的实现。