C++ 상속


객체 지향 프로그래밍에서 가장 중요한 개념 중 하나는 상속입니다. 상속을 사용하면 다른 클래스를 기반으로 클래스를 정의할 수 있으므로 애플리케이션을 더 쉽게 만들고 유지 관리할 수 있습니다. 이는 또한 코드 기능을 재사용하고 실행 시간을 향상시키는 효과를 얻습니다.

클래스를 생성할 때 새 데이터 멤버와 멤버 함수를 다시 작성할 필요가 없으며 새 클래스가 기존 클래스의 멤버를 상속하도록 지정하기만 하면 됩니다. 이 기존 클래스를 기본 클래스라고 하고 새 클래스를 파생 클래스라고 합니다.

상속은 is 관계를 나타냅니다. 예를 들어, 포유류는 동물이고 개는 포유류이므로 개는 동물입니다.

기본 클래스 및 파생 클래스

클래스는 여러 클래스에서 파생될 수 있습니다. 즉, 여러 기본 클래스에서 데이터와 함수를 상속받을 수 있습니다. 파생 클래스를 정의하려면 클래스 파생 목록을 사용하여 기본 클래스를 지정합니다. 클래스 파생 목록은 하나 이상의 기본 클래스 이름을 따서 명명되고 다음 형식을 갖습니다.

class derived-class: access-specifier base-class

여기서 액세스 한정자 access-specifier는 public, protected 또는 private 중 하나이고 base-class는 이전에 정의된 것입니다. 수업의 이름입니다. 액세스 지정자를 사용하지 않는 경우 기본값은 비공개입니다.

기본 클래스 Shape가 있다고 가정하고, Rectangle은 아래와 같이 파생 클래스입니다.

#include <iostream>
 
using namespace std;

// 基类
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 派生类
class Rectangle: public Shape
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Total area: 35

액세스 제어 및 상속

파생 클래스는 기본 클래스의 비공개 멤버가 아닌 모든 멤버에 액세스할 수 있습니다. 따라서 파생 클래스의 멤버 함수에서 기본 클래스 멤버에 액세스하지 않으려면 기본 클래스에서 private으로 선언해야 합니다.

다음과 같이 액세스 권한에 따라 다양한 액세스 유형을 요약할 수 있습니다.

파생 클래스yesyesno외부 클래스yesnono

파생 클래스는 다음 경우를 제외하고 모든 기본 클래스 메서드를 상속합니다.

  • 기본 클래스의 생성자, 소멸자 및 복사 생성자.

  • 기본 클래스에 대한 연산자가 오버로드되었습니다.

  • 기본 클래스의 Friend 함수입니다.

상속 유형

클래스가 기본 클래스에서 파생되면 기본 클래스는 public, protected 또는 private로 상속될 수 있습니다. 상속된 유형은 위에서 설명한 액세스 지정자를 통해 지정됩니다.

우리는 protected 또는 private 상속을 거의 사용하지 않으며 일반적으로 public 상속을 사용합니다. 다양한 유형의 상속을 사용하는 경우 다음 규칙을 따르세요.

  • 공개 상속(공개): 클래스가 public 기본 클래스에서 파생되면 기본 클래스의 public 멤버도 of입니다. 파생 클래스 Public 멤버, protected 기본 클래스 멤버도 protected 파생 클래스 멤버, private 기본 클래스 멤버는 파생 클래스에서 직접 액세스할 수 없지만 public protected 기본 클래스 액세스 멤버입니다.

  • 보호 상속: 클래스가 protected 기본 클래스에서 파생되면 기본 클래스의 public protected 멤버가 파생 클래스의 protected 멤버가 됩니다.

  • 개인 상속(개인): 클래스가 private기본 클래스에서 파생되면 기본 클래스의 publicprotected 멤버가 파생 클래스의 private 멤버가 됩니다.

다중 상속

다중 상속은 하위 클래스가 여러 부모 클래스를 가질 수 있으며 여러 부모 클래스의 특성을 상속한다는 의미입니다.

C++ 클래스는 여러 클래스에서 멤버를 상속할 수 있습니다. 구문은 다음과 같습니다.

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

그 중 액세스 수정자 상속 방법은 public, protected 또는 private 중 하나이며 각 기본 클래스를 수정하는 데 사용됩니다. 위와 같이 쉼표로 구분하세요. 이제 다음 예를 살펴보겠습니다.

#include <iostream>
 
using namespace std;

// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};

// 派生类
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();
   
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   // 输出总花费
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Total area: 35
Total paint cost: 50