HOWTO · C++

C++ 상속 생성자

C++의 상속과 생성자를 상속하는 방법에 대한 완전한 프로그래밍 자습서입니다.

이 페이지의 내용

이 문서는 C++의 상속 개념과 파생 클래스에서 기본 클래스의 생성자를 상속하는 방법에 대해 설명합니다.

C++의 상속

C++, 특히 객체 지향 프로그래밍에서 가장 기본적이고 널리 사용되는 개념은 상속입니다. 클래스를 다른 클래스의 자식 클래스로 정의할 수 있는 기능입니다.

이를 통해 일부 코드 기능을 재사용하고 구현 시간을 줄일 수 있습니다. 이를 통해 기본 클래스에서 파생 클래스로 기능과 속성을 파생시킬 수 있습니다.

  1. 기본 클래스 - 다른 클래스에서 속성과 기능을 사용하는 클래스를 기본 클래스라고 합니다. 때로는 수퍼 클래스라고도 합니다.
  2. 파생 클래스 - 다른 클래스의 속성과 기능을 가져오는 클래스를 파생 클래스라고 합니다. 때로는 하위 클래스라고도 합니다.

일부 차량의 예를 고려하십시오. 자동차, 버스, 트럭은 모두 자동차이며 이러한 자동차는 모두 공통된 특성이 있고 다른 것도 있습니다.

이 모든 것이 자동차이고 모든 자동차는 모두에게 균일한 몇 가지 기능을 가지고 있습니다. 이 모든 자동차에 대한 클래스를 생성하면 많은 코드 복제를 수행하게 됩니다.

이것은 아래 그림에 설명되어 있습니다.

계승

위의 이미지를 보면 모든 자동차가 동일한 기능을 가지고 있음을 알 수 있습니다. 이렇게 하면 코드가 세 번 중복됩니다.

코드 중복은 오류 가능성, 처리 시간 증가 등과 같은 다른 많은 문제를 낳습니다. 이러한 상황을 극복하기 위해 상속이 사용됩니다.

이 모든 기능으로 구성된 Automobile 클래스를 만들고 이 클래스로 나머지 클래스를 파생시킬 수 있습니다. 이를 통해 코드 중복을 줄이고 코드 재사용성을 높일 수 있습니다.

상속 솔루션

위의 이미지에서 중복 코드를 줄였으며 모든 기능이 모든 클래스에 포함되어 있음을 알 수 있습니다. 상속은 일반적으로 is-a 관계를 정의합니다.

예를 들어 자동차는 자동차 is-a, 원형 is-a 모양, 강아지 is-a 동물 등입니다.

C++에서 상속 구현

기본 클래스에서 하위 클래스를 파생시키려면 다음 구문을 따라야 합니다.

class derived - class - name : access - specifier base - class - name { .. }

이 액세스 지정자는 기본 클래스에서 기능을 상속하는 방법을 결정하는 데 사용됩니다. 모두가 필요한지 일부가 필요한지 여부는 액세스 지정자를 기반으로 결정됩니다.

public, private 또는 protected일 수 있습니다. 액세스 지정자를 지정하지 않으면 기본적으로 private입니다.

예시:

public
class Automobile {
 public:
  getFuelAmount();
  applyBrakes();
  startEngine();
  stopEngine();
} public class Car : public Automobile {
  pressHorn();
} public class Bus : public Automobile {
  pressHorn();
}

위의 코드에서 경적 소리가 모든 차량에 대해 다르기 때문에 두 파생 클래스에는 둘 다에 대해 균일하지 않은 기능이 하나만 있음을 알 수 있습니다. 따라서 파생 클래스에서 해당 함수를 만들고 나머지는 기본 클래스에 있습니다.

Shapes 클래스의 또 다른 예를 고려하십시오.

#include <iostream>
#include <string>
using namespace std;
class Shapes {
 public:
  int w;
  int h;
};
class Square : public Shapes {
 public:
  int getArea() { return w * h; }
};
int main() {
  Square s;
  s.w = 5;
  s.h = 5;
  cout << "Area: " << s.getArea() << endl;
  return 0;
}

출력:

Area: 25

C++의 생성자 상속

이전 예제에서 기본 클래스에서와 마찬가지로 파생 클래스에서도 함수와 속성이 상속됨을 알 수 있습니다. 그러나 기본 클래스 생성자를 호출해야 하는 경우 파생 클래스의 생성자에서 명시적으로 호출해야 합니다.

생성자는 자동으로 호출되지 않습니다. 아래의 예를 고려하십시오.

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
 public:
  derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

출력:

In constructor: Base
In Constructor: derived
In main

C++11에서는 using-declaration을 사용하여 이 작업을 수행할 수 있습니다. using-declaration을 사용하면 기본 클래스에서 파생 클래스 함수를 사용할 수 있습니다.

위의 예는 다음과 같이 수정할 수 있습니다.

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
  using baseClass::baseClass;

 public:
  derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

또한 동일한 출력을 얻을 것입니다.

In constructor: Base
In Constructor: derived
In main