[Basic C++] #7_클래스 상속 활용 방법
C++ 개발에서 상속을 통해 클래스를 생성하는 방법에 대해서 알아보겠습니다.
"전문가를 위한 C"의 9 항목, "클래스 상속 활용 테크닉"에 해당하는 내용입니다.
상속
// Parent Class 정의
class Super
{
public:
Super();
~Super();
void SomeMethod_1();
protected:
int mProtectedInt;
private:
int mPrivateInt;
};
// Child Class 정의
class Sub : public Super
{
public:
Sub();
void SomeMethod_2();
};
서브 클래스, 혹은 자식 클래스는 부모 클래스와 "is-a" 관계를 형성합니다. "is-a" 관계에 대한 자세한 내용은 아래 링크를 참조해 주세요. 따라서, 자식 클래스 객체는 부모 클래스의 public 멤버 함수와 데이터 멤버에 접근할 수 있습니다.
여기서 중요한 점은, 부모 클래스 객체는 자식 클래스 객체의 public 멤버 함수와 데이터 멤버에 접근할 수 없습니다.
부모 클래스 객체의 자식 클래스 데이터 멤버 접근
Super* superClass = new Sub();
superClass->SomeMethod_2(); // 에러 발생!!
Super 타입, 즉 부모 클래스를 가리키는 포인터는 자식 클래스의 멤버 함수들을 호출 할 수 없습니다!
오버 라이딩, virtual, ovrride
// 부모 클래스
class Parent
{
public:
Parent();
virtual ~Parent();
virtual void SomeMethod(); // virtual 키워드 사용
};
// 자식 클래스
class Child : public Parent
{
public:
Child();
virtual void SomeMethod() override;
void SomeMethod_2();
}
멤버 함수의 오버라이딩 작동을 위해 부모 클래스에서 "virtual" 키워드를 작성합니다. 실제 파생 클래스에서 해당 함수를 오버라이드 하기 위해 똑같이 "virtual" 키워드를 통해 선언해주고, 재정의를 진행합니다. 파생 클래스에서 재선 언 할 때, "virtual" 키워드가 없어도 정상적으로 동작하지만, 적어 줄 것을 권장합니다.
참조형 변수, 포인터 변수
ChildClass c1;
ParentClass& p1 = c1;
p1->SomeMethod(); // 파생 클래스에서 재정의된 가상 멤버 함수 호출
p1->SomeMethod_2(); // 에러 발생, 부모 클래스 타입의 객체는
// 파생 클래스의 멤버 함수를 호출 할 수 없다!
포인터나 참조를 통해 특정 클래스나 해당 클래스의 파생 클래스를 가리킬 수 있습니다. 이때, 참조나 포인터가 어떤 타입인지와 관계없이 가상 멤버 함수의 호출은 가장 마지막 파생 클래스에서 오버라이딩한 내용을 호출합니다. 이때, 참조나 포인터의 타입이 부모 클래스일 경우, 오직 파생 클래스에만 존재하는 멤버 함수는 호출 할 수 없습니다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #9 객체의 업캐스팅과 다운캐스팅, 슬라이싱 (0) | 2022.03.16 |
---|---|
[Basic C++] #8 파생 클래스와 베이스 클래스의 연동, 생성 순서, 생성자 체이닝, 캐스팅 (0) | 2022.03.16 |
[Basic C++] #6_오버라이딩과 오버로딩의 차이점 (0) | 2022.03.07 |
[Basic C++] #5 메서드 종류, static 메서드, const 메서드 (0) | 2022.03.07 |
[Basic C++] #4 데이터 멤버의 종류, static, const (0) | 2022.03.07 |