Coding/C & C++

C++ 상속 정리

heyoon2j 2020. 2. 24. 00:13

 C++ 상속 정리

ㆍ 상속

- 하위 클래스가 상위 클래스로부터 멤버변수와 멤버함수를 물려받는다.

- 상속을 하는 이유는 "상속을 통해 연관된 일련의 클래스에 대해 공통적인 규약을 정의할 수 있다"

 

ex>

class Person

{

private:

     int age;

     char name[50];

public:

     Person(){

         name = NULL;

          age = 0;

     }

     Person(int myage, char* myname) : age(myage)

     {

           name = new char[strlen(myname)+1];

           strcpy(name, myname);

     }

     ~Person(){

         delete []name;

     }

     void WhatYourName() const

     {    ...    }

     void HowOldAreYou() const

     {    ...    }

};

 

class UnivStudent : public Person

{

private:

     char major[50];

public:

     UnivStudent(int myage, char* myname, char* mymajor)

         : Person(myname, myage)

     {

         major = new char[strlen(mymajor)+1];

         strcpy(major,mymajor);

     }

     void WhoAreYou() const

     {

         WhatYourName();

         HowOldAreYou();

     }

};

 

1. 상속 초기화

=> 하위 클래스는 상위 클래스의 멤버까지 초기화해야 한다.

* 초기화는 상위 클래스의 생성자를 호출해서 멤버를 초기화하는 것이 좋다.

ex>

 UnivStudent(int myage, char* myname, char* mymajor)

         : Person(myname, myage)

     {     ...     }

 

=> 초기화 순서는 아래와 같다

* "메모리 공간의 할당 -> 하위 클래스 생성자 호출 -> 상위 클래스 생성자 호출 -> 상위 클래스 생성자 완료 -> 하위 클래스 생성자 완료" 순으로 진행

* 메모리에 스택 형태로 저장되기 때문에, 소멸자는 초기화와 반대로 진행, "하위 클래스 소멸자 -> 하위 클래스 소멸자" 순으로 진행

 

 

2. 상속 접근제어

=> 접근 제한의 기준은 클래스이기 때문에 private로 설정되어 있는 경우, 하위 클래스에서 상위 클래스의 멤버에 접근하기 위해서는 public이나 protected를 통해서만 접근 가능하다.

 

 

3. 다형성

- 가상 함수를 이용

- 모습은 같은데 형태는 다른 것

=> 포인터 변수는 같지만, 실제 가리키는 객체가 달라 결과가 다르게 나온다.

 

 

4. 다중 상속

=> 여러 개를 상속받는 것으로, 매우 제한적으로만 사용된다.

ex>

class MultiDerived : public BaseOne, protected BaseTwo

{

public:

     void ComplexFunc()

     {

         SimpleFuncOne();

         SimpleFuncTwo();

     }

};

 

* 다중 상속의 대상이 되는 두 상위 클래스에 동일한 이름의 멤버가 존재하는 경우, 다음과 같이 해결

ex>

class MultiDerived : public BaseOne, protected BaseTwo

{

public:

     void ComplexFunc()

     {

          BaseOne::SimpleFunc();

          BaseTwo::SimpleFunc();

     }

};

 

 

5. 가상 상속

=> 다중 상속을 사용하게 되면, 예외적으로 최상위 클래스를 두 번 호출하게 되는 경우가 있다. 이를 막기 위해 사용된다.

ex>

class MiddleDerivedOne : virtual public Base