C++의 상속
상속은 기본 개념이다. OOP(객체 지향 프로그래밍) . 이는 한 클래스가 다른 클래스의 기능(필드 및 메서드)을 상속하도록 허용하는 메커니즘입니다. 상속이란 기존 클래스를 기반으로 새 클래스를 만드는 것을 의미합니다. 다른 클래스에서 상속되는 클래스는 해당 클래스의 메서드와 필드를 재사용할 수 있습니다.
예: 다음 예제에서 Animal은 기본 클래스이고 Dog Cat 및 Cow는 Animal 클래스를 확장하는 파생 클래스입니다.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
산출
Dog barks Cat meows Cow moos
설명:
- Animal은 sound() 함수가 있는 기본 클래스입니다.
- Dog Cat 및 Cow는 각각 고유한 sound() 메서드를 정의하는 파생 클래스입니다.
- Main()에서는 Dog Cat과 Cow의 객체가 별도로 생성됩니다.
- 각 객체에서 sound()를 호출하면 해당 하위 클래스 메서드가 실행됩니다(개가 짖고 고양이가 야옹하고 소가 무스).
통사론
C++ class ChildClass : public ParentClass { // Additional fields and methods };
C++에서 상속은 어떻게 작동하나요?
콜론(:) 액세스 지정자 C++에서는 상속에 사용됩니다. 파생 클래스(자식 클래스)가 기본 클래스(상위 클래스)의 데이터 멤버(필드)와 멤버 함수(메서드)를 상속할 수 있습니다.
클래스가 다른 클래스를 상속하면 상위 클래스의 액세스 가능한 모든 멤버를 가져오고 하위 클래스도 해당 멤버를 재정의(재정의)하거나 새 기능을 추가할 수 있습니다.
C++의 상속 유형
다음은 C++에서 지원되는 다양한 유형의 상속입니다.
1. 단일 상속
단일 상속에서는 하위 클래스가 하나의 상위 클래스에서만 파생됩니다. 단일 부모 클래스의 속성과 동작을 상속합니다. 때로는 단순 상속이라고도 합니다.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
산출
This is a Vehicle This Vehicle is Car
2. 다중 상속
~ 안에 다중 상속 하나의 클래스는 둘 이상의 슈퍼클래스를 가질 수 있으며 모든 상위 클래스의 기능을 상속받을 수 있습니다.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
산출
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. 다단계 상속
C++의 다단계 상속은 클래스가 상속 체인을 형성하는 다른 파생 클래스에서 파생된다는 의미입니다.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
산출
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. 계층적 상속
계층적 상속에서는 하나 이상의 하위 클래스가 단일 기본 클래스에서 상속됩니다. 즉, 단일 기본 클래스에서 둘 이상의 파생 클래스가 생성됩니다. 예를 들어 자동차와 버스는 모두 차량입니다.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
산출
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. 하이브리드 상속
두 가지 이상의 상속 유형이 하나의 프로그램에 결합된 경우. 예를 들어 클래스는 다중 상속을 사용하고 다중 레벨 상속 체인의 일부일 수도 있습니다.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
산출
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
하이브리드 상속으로 인해 다이아몬드 문제 C++에서. 이는 클래스가 동일한 기본 클래스를 공유하는 두 클래스에서 상속될 때 발생합니다. 결과적으로 파생 클래스는 기본 클래스 멤버의 여러 복사본을 가져오므로 어떤 멤버를 사용할지 모호해집니다.
메모 : 해결책은 가상 상속을 사용하여 기본 클래스의 단일 복사본만 공유하는 것입니다.
C++ 상속의 장점
- 코드 재사용성 : 파생 클래스는 코드 중복을 피하면서 기본 클래스의 데이터 멤버와 메서드를 직접 재사용할 수 있습니다.
- 추상화 : 추상화를 적용하는 공통 인터페이스를 정의하는 추상 클래스(순수 가상 함수가 있는 클래스)를 지원합니다.
- 클래스 계층 구조: 계층 구조(기본 → 파생 → 추가 파생)를 구축하여 실제 관계를 모델링할 수 있습니다.
- 다형성: 가상 함수를 통한 런타임 다형성과 함수 오버로딩 및 템플릿을 통한 컴파일 타임 다형성을 완벽하게 지원합니다.
C++ 상속의 단점
- 긴밀한 커플 링 : 하위 클래스는 상위 클래스에 종속됩니다. 기본 클래스가 변경되면 파생 클래스도 강제로 변경될 수 있습니다.
- 유연성 감소: 때로는 구성(관계 있음)이 덜 유연한 코드로 이어지는 경우 상속이 잘못 사용됩니다.
- 복잡성 증가: 깊은 상속 계층 구조(다중 수준 또는 하이브리드)로 인해 코드 유지 관리 및 디버그가 어려워질 수 있습니다.
- 다이아몬드 문제: 하이브리드 또는 다중 상속의 경우 동일한 기본 클래스가 여러 번 상속되면 모호성이 발생할 수 있습니다.
- 가상 기능의 오버헤드: 다형성(가상 함수)을 사용하는 경우 가상 테이블 조회로 인해 런타임 오버헤드가 약간 발생합니다.