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