C++ 继承

继承是面向对象编程中的一个核心概念,它允许我们定义一个类来继承另一个类的属性和方法。通过继承,我们可以创建一个新的类,这个新类可以重用、扩展或修改已存在的类的行为。

继承的基本概念

定义派生类

在 C++ 中,可以通过在派生类的声明中使用冒号 : 来指定基类。例如,假设有一个基类 Base,我们想要创建一个派生类 Derived,可以从 Base 派生出 Derived

-- -------------------- ---- -------
----- ---- -
-------
    ---- -------------- -
        -- ------
    -
--

----- ------- - ------ ---- -
-------
    ---- ----------------- -
        -- -------
    -
--

在这个例子中,Derived 类继承了 Base 类,并且可以通过 public 关键字指定继承的方式。除了 public,还有 protectedprivate 可供选择,它们分别对应不同的访问控制级别。

访问控制

  • Public:基类的公有成员在派生类中仍然是公有的。
  • Protected:基类的受保护成员在派生类中保持为受保护的。
  • Private:基类的私有成员在派生类中不可见,但可以通过基类提供的公有接口间接访问。

构造函数与析构函数

当创建一个派生类的对象时,首先会调用基类的构造函数,然后才是派生类的构造函数。相反地,在销毁派生类的对象时,先调用派生类的析构函数,再调用基类的析构函数。

-- -------------------- ---- -------
----- ---- -
-------
    ------ -
        -- ------
    -

    ------- -
        -- ------
    -
--

----- ------- - ------ ---- -
-------
    --------- -
        -- -------
    -

    ---------- -
        -- -------
    -
--

多重继承

C++ 允许一个类从多个基类派生,这种机制称为多重继承。虽然多重继承提供了极大的灵活性,但它也可能导致复杂性和一些潜在的问题,如二义性问题。

定义多重派生类

-- -------------------- ---- -------
----- ----- -
-------
    ---- --------------- -
        -- --------
    -
--

----- ----- -
-------
    ---- --------------- -
        -- --------
    -
--

----- ------- - ------ ------ ------ ----- -
-------
    ---- ----------------- -
        -- -------
    -
--

在这个例子中,Derived 类同时继承自 Base1Base2。这样,Derived 对象将拥有来自 Base1Base2 的所有成员。

解决二义性问题

多重继承的一个常见问题是二义性,即如果派生类有两个基类都具有相同的成员名称,则派生类将无法区分这些成员。解决这个问题的方法之一是在派生类中明确指定要使用的基类成员:

或者通过在派生类中重新定义该成员:

虚基类

虚基类用于处理多重继承中可能产生的二义性问题。当一个类从多个基类派生时,如果这些基类有一个共同的祖先类,那么这个共同的祖先类可能会被多次实例化。为了防止这种情况发生,可以将该祖先类声明为虚基类。

定义虚基类

-- -------------------- ---- -------
----- ---- -
-------
    ---- -------------- -
        -- ------
    -
--

----- -------- - ------- ------ ---- -
-------
    ---- ------------------ -
        -- --------
    -
--

----- -------- - ------- ------ ---- -
-------
    ---- ------------------ -
        -- --------
    -
--

----- ------------ - ------ --------- ------ -------- -
-------
    ---- ---------------------- -
        -- ---------
    -
--

在这个例子中,Base 类被声明为虚基类,因此即使 Derived1Derived2 都继承自 BaseMultiDerived 对象中只会有一个 Base 的实例。

总结

本章详细介绍了 C++ 中继承的概念及其应用,包括基本继承、访问控制、构造函数与析构函数的调用顺序、多重继承以及虚基类的使用。继承是面向对象编程的核心特性之一,正确理解和使用它可以大大提高代码的复用性和可维护性。

纠错
反馈