Cplusplus 简明教程
C++ Inheritance
面向对象编程中最重要的概念之一是继承。继承允许我们根据另一个类定义一个类,这使得创建和维护应用程序变得更容易。这也提供了重用代码功能和快速实现时间的机会。
在创建类时,编程人员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和成员函数。这个现有的类叫做 base 类,而新类被称为 derived 类。
继承的思想实现了 is a 关系。例如,哺乳动物 IS-A 动物,狗 IS-A 哺乳动物,因此狗 IS-A 动物,以此类推。
Base and Derived Classes
一个类可以从多个类派生,这意味着它可以从多个基类继承数据和函数。要定义派生类,我们使用类派生列表来指定基类。类派生列表命名一个或多个基类,形式为 -
class derived-class: access-specifier base-class
其中访问说明符是 public, protected, 或 private 之一,基类是先前定义类的名称。如果未使用访问说明符,那么它默认是私有的。
考虑基类 Shape 及其派生类 Rectangle ,如下所示 -
#include <iostream>
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 Control and Inheritance
派生类可以访问其基类的所有非私有成员。因此对于不应该对派生类的成员函数可访问的基类成员,应当在基类中声明为私有。
我们可以对不同访问类型按照下面方式进行总结——谁可以访问它们?
Access |
public |
protected |
private |
Same class |
yes |
yes |
yes |
Derived classes |
yes |
yes |
no |
Outside classes |
yes |
no |
no |
派生类继承所有基类方法,但有以下例外——
-
基类的构造函数、析构函数和拷贝构造函数。
-
基类的重载运算符。
-
基类的友元函数。
Type of Inheritance
派生类可继承从基类,这继承方式可以是 public, protected 或 私有 继承。继承类型由访问说明符指定,如上所解释。
我们很少使用 protected 或 私有 继承,但 public 继承比较常用。在使用不同类型的继承时,应用以下规则——
-
Public Inheritance - - 从 public 基类派生类时,基类的 public 成员成为派生类的 public 成员和基类的 protected 成员成为派生类的 protected 成员。基类的 private 成员永远无法直接从派生类中访问,但可以通过调用基类的 public 和 protected 成员访问。
-
Protected Inheritance - - 从 protected 基类派生时,基类的 public 和 protected 成员成为派生类的 protected 成员。
-
Private Inheritance − 从 private 基类派生时,基类的 public 和 protected 成员将成为派生类的 private 成员。
Multiple Inheritance
一个 C++ 类可以从多个类继承成员,其扩展语法如下 −
class derived-class: access baseA, access baseB....
其中访问之一是 public, protected, 或 private ,并且将给予每个基类,并且它们将按逗号分隔,如上所示。让我们尝试以下示例 −
#include <iostream>
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