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

派生类继承所有基类方法,但有以下例外——

  1. 基类的构造函数、析构函数和拷贝构造函数。

  2. 基类的重载运算符。

  3. 基类的友元函数。

Type of Inheritance

派生类可继承从基类,这继承方式可以是 public, protected私有 继承。继承类型由访问说明符指定,如上所解释。

我们很少使用 protected私有 继承,但 public 继承比较常用。在使用不同类型的继承时,应用以下规则——

  1. Public Inheritance - - 从 public 基类派生类时,基类的 public 成员成为派生类的 public 成员和基类的 protected 成员成为派生类的 protected 成员。基类的 private 成员永远无法直接从派生类中访问,但可以通过调用基类的 publicprotected 成员访问。

  2. Protected Inheritance - - 从 protected 基类派生时,基类的 publicprotected 成员成为派生类的 protected 成员。

  3. Private Inheritance − 从 private 基类派生时,基类的 publicprotected 成员将成为派生类的 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