📜  C++继承

📅  最后修改于: 2020-12-17 05:10:53             🧑  作者: Mango


面向对象编程中最重要的概念之一就是继承。继承使我们可以用另一个类来定义一个类,这使创建和维护应用程序变得更加容易。这也提供了重用代码功能和快速实现时间的机会。

创建类时,程序员可以指定新类应继承现有类的成员,而不必编写全新的数据成员和成员函数。此现有类称为类,而新类称为派生类。

继承的概念实现了一种关系。例如,哺乳动物IS-A动物,狗IS-A哺乳动物以及狗IS-A动物等等。

基类和派生类

一个类可以从多个类派生,这意味着它可以从多个基类继承数据和函数。要定义派生类,我们使用类派生列表来指定基类。一个类派生列表命名一个或多个基类,其格式为-

class derived-class: access-specifier base-class

其中access-specifier是public,protectedprivate之一,而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