本文讨论了C++中的继承概念。此外,它还讨论了各种C++继承类型。当一个类能够从另一个类继承属性时,就称为继承。被继承属性的类称为基类,而继承属性的类称为派生类。
想象一个名为“汽车”的类,其下有“宝马”、“梅赛德斯”等子类。在“汽车”名称下,例如“梅赛德斯”,还有其他称为“车辆型号”的子类。这是理解继承概念的典型示例。
如上例所示,梅赛德斯类继承了汽车类的属性,这种类从另一个类获取属性的能力称为继承。
继承是面向对象编程(OOP)的关键基础之一,它也非常有益。它促进了代码的重用,从而节省了大量时间,使其成为理解编程世界必不可少的一项概念。
类是模板,它定义了特定类型的所有对象所共有的变量和方法。汽车就是一个类,就像上面提到的例子一样。
在继承中,类有两种类别
父类或基类:一个类,从中派生类继承其属性。就像前面提到的例子一样,汽车是一个父类。
子类或派生类:从另一个类继承属性的类称为“子类”或“派生类”。就像前面提到的例子一样,宝马和梅赛德斯属于同一个子类。
使用“:”符号来继承一个类。
在下面的示例中,Car类(子类)从Vehicle类(父类)继承了以下方法和属性:
#include <iostream>
#include <string>
using namespace std;
// Base class
class Vehicle {
public:
string brand = "BMW";
void honk() {
cout << "hoo, huut! \n" ;
}
};
// Derived class
class Car: public Vehicle {
public:
string model = "BMW X5";
};
int main() {
Car myCar;
myCar.honk();
cout << myCar.brand + " " + myCar.model;
return 0;
}
输出
hoo, huut! BMW BMW X5
在C++中,继承用于允许我们重用现有类的代码。C++大力提倡重用的理念。重用性也是OOP(面向对象编程)的一个关键方面。
为了节省时间并提高可靠性,总是优先重用已有的东西,而不是试图构建类似但不存在的东西。
在C++中,当我们需要一个类除了拥有自身的属性外,还能使用其超类(父类)的属性,并且这两个类在程序中共享相同的逻辑域时,我们就会使用继承。
例如,有一个名为“Animal”的基类或父类,以及一个名为“Dog”的子类。因为狗是动物,所以“Animal”类的所有公共属性都应该存在于“Dog”类中,同时也要包含狗作为动物的属性。
继承主要有3种模式:
下表列出了上述三种继承类型,并显示了当使用所有三种继承模式时,C++中基类的成员访问说明符。

多级继承至少涉及两个类,可能更多。一个新形成的子类成为一个新类的基类,一个类继承其父类的特性。
一个类也可以仅从另一个已经从另一个类派生的类派生。
在下面的示例中,MyGrandChild 是从 MyChild 派生的(MyChild 是从 MyClass 派生的)。
#include <iostream>
using namespace std;
// Parent class
class MyClass {
public:
void myFunction() {
cout << "a few items in the parent class." ;
}
};
// Child class
class MyChild: public MyClass {
};
// Grandchild class
class MyGrandChild: public MyChild {
};
int main() {
MyGrandChild myObj;
myObj.myFunction();
return 0;
}
输出
a few items in the parent class.
通过使用逗号分隔的列表,一个类可以从多个基类派生。
由于C++的多重继承特性,一个类可以从多个类继承。继承类的构造函数按照它们被继承的顺序调用。
例如,在下面的代码中,构造函数 B 在构造函数 A 之前被调用。
#include <iostream>
using namespace std;
// Base class
class MyClass {
public:
void myFunction() {
cout << " content in the parent class.\n" ;
}
};
// Another base class
class MyOtherClass {
public:
void myOtherFunction() {
cout <<" content with in the another class.\n" ;
}
};
// Derived class
class MyChildClass: public MyClass, public MyOtherClass {
};
int main() {
MyChildClass myObj;
myObj.myFunction();
myObj.myOtherFunction();
return 0;
}
输出
content in the parent class. content with in the another class.