언어/Basic C++

[Basic C++] #7 클래스 상속 활용 방법

Hardii2 2022. 3. 10. 00:55

[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 멤버 함수와 데이터 멤버에 접근할 수 없습니다. 

 

 

[Effective C++] #32_public 상속

[Effective C++] #32_Public 상속 Scott Meyers의 "Effective C++" 를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 6장 '상속 그리고 객체 지향 설계', 항목 32 "Public 상속..

webddevys.tistory.com

 

부모 클래스 객체의 자식 클래스 데이터 멤버 접근
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();	// 	에러 발생, 부모 클래스 타입의 객체는
			//	파생 클래스의 멤버 함수를 호출 할 수 없다!

포인터나 참조를 통해 특정 클래스나 해당 클래스의 파생 클래스를 가리킬 수 있습니다. 이때, 참조나 포인터가 어떤 타입인지와 관계없이 가상 멤버 함수의 호출은 가장 마지막 파생 클래스에서 오버라이딩한 내용을 호출합니다. 이때, 참조나 포인터의 타입이 부모 클래스일 경우, 오직 파생 클래스에만 존재하는 멤버 함수는 호출 할 수 없습니다!