📅  最后修改于: 2020-12-17 05:10:53             🧑  作者: Mango
面向对象编程中最重要的概念之一就是继承。继承使我们可以用另一个类来定义一个类,这使创建和维护应用程序变得更加容易。这也提供了重用代码功能和快速实现时间的机会。
创建类时,程序员可以指定新类应继承现有类的成员,而不必编写全新的数据成员和成员函数。此现有类称为基类,而新类称为派生类。
继承的概念实现了一种关系。例如,哺乳动物IS-A动物,狗IS-A哺乳动物以及狗IS-A动物等等。
一个类可以从多个类派生,这意味着它可以从多个基类继承数据和函数。要定义派生类,我们使用类派生列表来指定基类。一个类派生列表命名一个或多个基类,其格式为-
class derived-class: access-specifier base-class
其中access-specifier是public,protected或private之一,而base-class是先前定义的类的名称。如果未使用访问说明符,则默认情况下为私有。
考虑如下的基类Shape及其派生类Rectangle-
#include
using namespace std;
// Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
编译并执行上述代码后,将产生以下结果-
Total area: 35
派生类可以访问其基类的所有非私有成员。因此,派生类的成员函数不可访问的基类成员应在基类中声明为私有。
我们可以根据-谁可以通过以下方式访问它们来总结不同的访问类型-
Access | public | protected | private |
---|---|---|---|
Same class | yes | yes | yes |
Derived classes | yes | yes | no |
Outside classes | yes | no | no |
派生类继承了所有基类方法,但以下情况例外:
从基类派生一个类时,可以通过公共,受保护或私有继承来继承基类。继承的类型由访问说明符指定,如上所述。
我们几乎不使用受保护的继承或私有继承,但通常使用公共继承。当使用不同类型的继承时,遵循以下规则-
公有继承-当从一个公共基类派生一个类,基类的公有成员成为派生类的公有成员和基类的成为派生类的保护成员的保护成员。不能直接从派生类访问基类的私有成员,而可以通过调用基类的公共成员和受保护成员来访问。
受保护的继承-从受保护的基类派生时,基类的公共成员和受保护成员成为派生类的受保护成员。
私有继承-从私有基类派生时,基类的公共成员和受保护成员将成为派生类的私有成员。
一个C++类可以从多个类中继承成员,这是扩展的语法-
class derived-class: access baseA, access baseB....
如果访问权限是公共,受保护的或私有的,并且将为每个基类提供访问权限,则访问权限将用逗号分隔,如上所示。让我们尝试以下示例-
#include
using namespace std;
// Base class Shape
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Base class PaintCost
class PaintCost {
public:
int getCost(int area) {
return area * 70;
}
};
// Derived class
class Rectangle: public Shape, public PaintCost {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
// Print the total cost of painting
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
编译并执行上述代码后,将产生以下结果-
Total area: 35
Total paint cost: $2450