继承是面向对象编程中的一个核心概念,它允许我们定义一个类来继承另一个类的属性和方法。通过继承,我们可以创建一个新的类,这个新类可以重用、扩展或修改已存在的类的行为。
继承的基本概念
定义派生类
在 C++ 中,可以通过在派生类的声明中使用冒号 :
来指定基类。例如,假设有一个基类 Base
,我们想要创建一个派生类 Derived
,可以从 Base
派生出 Derived
:
-- -------------------- ---- ------- ----- ---- - ------- ---- -------------- - -- ------ - -- ----- ------- - ------ ---- - ------- ---- ----------------- - -- ------- - --
在这个例子中,Derived
类继承了 Base
类,并且可以通过 public
关键字指定继承的方式。除了 public
,还有 protected
和 private
可供选择,它们分别对应不同的访问控制级别。
访问控制
- Public:基类的公有成员在派生类中仍然是公有的。
- Protected:基类的受保护成员在派生类中保持为受保护的。
- Private:基类的私有成员在派生类中不可见,但可以通过基类提供的公有接口间接访问。
构造函数与析构函数
当创建一个派生类的对象时,首先会调用基类的构造函数,然后才是派生类的构造函数。相反地,在销毁派生类的对象时,先调用派生类的析构函数,再调用基类的析构函数。
-- -------------------- ---- ------- ----- ---- - ------- ------ - -- ------ - ------- - -- ------ - -- ----- ------- - ------ ---- - ------- --------- - -- ------- - ---------- - -- ------- - --
多重继承
C++ 允许一个类从多个基类派生,这种机制称为多重继承。虽然多重继承提供了极大的灵活性,但它也可能导致复杂性和一些潜在的问题,如二义性问题。
定义多重派生类
-- -------------------- ---- ------- ----- ----- - ------- ---- --------------- - -- -------- - -- ----- ----- - ------- ---- --------------- - -- -------- - -- ----- ------- - ------ ------ ------ ----- - ------- ---- ----------------- - -- ------- - --
在这个例子中,Derived
类同时继承自 Base1
和 Base2
。这样,Derived
对象将拥有来自 Base1
和 Base2
的所有成员。
解决二义性问题
多重继承的一个常见问题是二义性,即如果派生类有两个基类都具有相同的成员名称,则派生类将无法区分这些成员。解决这个问题的方法之一是在派生类中明确指定要使用的基类成员:
Derived d; d.Base1::baseFunction(); // 明确指定使用 Base1 的 baseFunction d.Base2::baseFunction(); // 明确指定使用 Base2 的 baseFunction
或者通过在派生类中重新定义该成员:
class Derived : public Base1, public Base2 { public: using Base1::baseFunction; // 引入 Base1 的 baseFunction 到派生类作用域 using Base2::baseFunction; // 引入 Base2 的 baseFunction 到派生类作用域 };
虚基类
虚基类用于处理多重继承中可能产生的二义性问题。当一个类从多个基类派生时,如果这些基类有一个共同的祖先类,那么这个共同的祖先类可能会被多次实例化。为了防止这种情况发生,可以将该祖先类声明为虚基类。
定义虚基类
-- -------------------- ---- ------- ----- ---- - ------- ---- -------------- - -- ------ - -- ----- -------- - ------- ------ ---- - ------- ---- ------------------ - -- -------- - -- ----- -------- - ------- ------ ---- - ------- ---- ------------------ - -- -------- - -- ----- ------------ - ------ --------- ------ -------- - ------- ---- ---------------------- - -- --------- - --
在这个例子中,Base
类被声明为虚基类,因此即使 Derived1
和 Derived2
都继承自 Base
,MultiDerived
对象中只会有一个 Base
的实例。
总结
本章详细介绍了 C++ 中继承的概念及其应用,包括基本继承、访问控制、构造函数与析构函数的调用顺序、多重继承以及虚基类的使用。继承是面向对象编程的核心特性之一,正确理解和使用它可以大大提高代码的复用性和可维护性。