C++ 서브클래스 상속

Namita Chaudhary 2023년10월12일
  1. C++ 서브클래스 상속
  2. C++ 하위 클래스의 다중 상속
  3. C++ 하위 클래스의 계층적 상속
  4. C++ 상속의 다이아몬드 문제
  5. 결론
C++ 서브클래스 상속

상속은 클래스가 다른 클래스의 속성과 동작을 획득하는 OOP의 기능입니다. 다른 클래스를 상속하는 클래스를 하위 클래스라고 하고 속성이 상속되는 클래스를 기본 클래스라고 합니다.

이 문서에서는 클래스를 상속하는 동안 발생하는 다이아몬드 문제에 대해 설명합니다.

C++ 서브클래스 상속

상속은 한 클래스가 다른 클래스의 속성을 상속할 수 있도록 하는 기능입니다. 다른 클래스의 속성을 상속하는 클래스를 하위 클래스 또는 파생 클래스라고 하는 반면 속성이 상속되는 클래스를 기본 클래스 또는 부모 클래스라고 합니다.

상속의 실제 예는 부모의 속성을 물려받는 자식일 수 있습니다.

C++에는 크게 단일 상속, 다중 상속, 다중 상속, 계층적 상속, 하이브리드 상속의 다섯 가지 유형의 상속이 있습니다.

  1. 단일 상속 - 이 유형의 상속에서는 단일 하위 클래스가 단일 기본 클래스에서 상속됩니다.
  2. 다중 상속 - 이 유형의 상속에서는 하위 클래스가 둘 이상의 기본 클래스에서 상속됩니다.
  3. 계층적 상속 - 이 유형의 상속에서는 여러 하위 클래스가 동일한 기본 클래스에서 상속됩니다.
  4. 다단계 상속 - 이 유형의 상속에서 클래스는 다른 클래스에 의해 상속되고 다른 클래스에 의해 상속됩니다. 예를 들어 A, BC라는 세 개의 클래스가 있는데 여기서 C 클래스는 B 클래스에 상속되고 B 클래스는 A 클래스에 상속됩니다.
  5. 하이브리드 상속 - 이 유형의 상속에서는 하나 이상의 상속 유형이 결합됩니다.

먼저 C++의 다중 및 계층적 상속에 대해 이야기하겠습니다.

C++ 하위 클래스의 다중 상속

앞에서 설명한 것처럼 하위 클래스는 다중 상속에서 여러 다른 기본 클래스에 의해 상속됩니다. 다중 상속을 자세히 이해하기 위해 예를 들어 보겠습니다.

#include <iostream>
using namespace std;
class Base1 {
 public:
  Base1() { cout << "Base class 1" << endl; }
};

class Base2 {
 public:
  Base2() { cout << "Base class 2" << endl; }
};

class Derived : public Base2, public Base1 {
 public:
  Derived() { cout << "Derived class" << endl; }
};

int main() {
  Derived d;
  return 0;
}

출력:

Base class 2
Base class 1
Derived class

위의 코드에는 Derived 클래스가 상속되는 두 개의 기본 클래스 Base1Base2가 있습니다. 그러나 기본 클래스의 생성자가 호출되는 순서에 유의해야 합니다.

먼저 Derived 클래스가 이를 먼저 상속한 다음 Base1 생성자를 상속하기 때문에 Base2 클래스 생성자가 호출됩니다.

C++ 하위 클래스의 계층적 상속

앞에서 설명한 것처럼 계층적 상속에서는 단일 기본 클래스에서 여러 하위 클래스가 상속됩니다. 계층적 상속을 자세히 이해하기 위해 예를 들어 보겠습니다.

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

class Derived1 : public Base {
 public:
  Derived1() { cout << "Derived class 1" << endl; }
};

class Derived2 : public Base {
 public:
  Derived2() { cout << "Derived class 2" << endl; }
};

int main() {
  Derived1 d1;
  Derived2 d2;
  return 0;
}

출력:

Base class
Derived class 1
Base class
Derived class 2

위의 코드 예제에는 Derived1Derived2 클래스가 일반적인 Base 클래스에서 상속되는 세 개의 클래스가 있습니다.

C++ 상속의 다이아몬드 문제

다이아몬드 문제는 계층적 상속과 다중 상속을 결합할 때 발생합니다. 이 문제는 클래스가 서로 상속하면서 다이아몬드 모양을 형성하기 때문에 그렇게 불립니다.

4개의 클래스 A, B, CD가 있는 시나리오가 있다고 가정해 보겠습니다.

  1. 클래스 A는 기본 클래스 역할을 합니다.
  2. 클래스 B는 클래스 A에 상속됩니다.
  3. 클래스 C는 클래스 A에도 상속됩니다.
  4. 클래스 D는 클래스 B와 클래스 C 모두에 의해 상속됩니다.

상속의 다이아몬드 문제

이제 코드의 도움으로 발생하는 문제를 살펴보겠습니다.

#include <iostream>
using namespace std;
class A {
 public:
  A() { cout << "Constructor A here!" << endl; }
};

class B : public A {
 public:
  B() { cout << "Constructor B here!" << endl; }
};

class C : public A {
 public:
  C() { cout << "Constructor C here!" << endl; }
};

class D : public B, public C {
 public:
  D() { cout << "Constructor D here!" << endl; }
};

int main() {
  D d;
  return 0;
}

출력:

Constructor A here!
Constructor B here!
Constructor A here!
Constructor C here!
Constructor D here!

위의 출력은 클래스 D가 클래스 A의 두 복사본을 가져오기 때문에 클래스 A의 생성자가 두 번 호출되었음을 보여줍니다. 하나는 클래스 B를 상속하고 다른 하나는 클래스 C를 상속합니다.

이는 모호성을 야기하며 C++에서 다이아몬드 문제라고 합니다.

이 문제는 주로 클래스가 공통 기본 클래스에서 상속된 여러 기본 클래스에서 상속될 때 발생합니다.

그러나 이 문제는 C++에서 virtual 키워드를 사용하여 해결할 수 있습니다. 자식 클래스가 공통 조부모 클래스의 두 복사본을 얻지 않도록 두 부모 클래스가 가상 클래스와 동일한 기본 클래스에서 상속하도록 합니다.

따라서 코드 예제에서 클래스 B 및 클래스 C 가상 클래스를 만들고 있습니다.

코드 예제를 통해 이 문제에 대한 해결책을 살펴보겠습니다.

#include <iostream>
using namespace std;
class A {
 public:
  A() { cout << "Constructor A here!" << endl; }
};

class B : virtual public A {
 public:
  B() { cout << "Constructor B here!" << endl; }
};

class C : virtual public A {
 public:
  C() { cout << "Constructor C here!" << endl; }
};

class D : public B, public C {
 public:
  D() { cout << "Constructor D here!" << endl; }
};

int main() {
  D d;
  return 0;
}

출력:

Constructor A here!
Constructor B here!
Constructor C here!
Constructor D here!

따라서 위 출력에 표시된 것처럼 이제 A 클래스 생성자의 사본 하나만 얻습니다. virtual 키워드는 클래스 B와 클래스 C가 모두 동일한 기본 클래스 A에서 상속하고 있음을 컴파일러에 알려줍니다. 따라서 한 번만 호출해야 합니다.

결론

이 기사에서는 상속 및 상속 유형에 대해 간략하게 설명했습니다. 그러나 우리는 상속의 다이아몬드 문제로 알려진 문제를 야기하는 다중 상속과 계층 상속의 두 가지 유형에 대해 주로 논의했습니다.

다이아몬드 문제는 클래스가 둘 이상의 기본 클래스에서 상속될 때 발생하며 이 기본 클래스도 단일 기본 클래스에서 상속됩니다. 그러나 이 문제는 C++에서 virtual 키워드를 사용하여 해결됩니다.

관련 문장 - C++ Inheritance