본문 바로가기
C++

상속!!

by 상레알 2009. 1. 15.

*생성자는 상속되지 않는  멤버 함수이다./상속되지 않는 멤버 함수로는 대입연산자가 잇다! **
상속은 상속이라는 단어의 의미처럼 물려받는다는 성격이 강하다. 따라서
과거에는 "상속은 기존에 정의해 놓은 클래스를 재활용하기 위해서 필요한 문법적 요소가 상속이다."라는 것이 강했다고 한다.

물론 상속은 이러한 이점도 지니지만, 이는 상속을 하는 근본적인 이유에 해당되지는 않는다.

여기에서는 " 상속은 재활용의 목적으로만 존재하는 문법적인 요소가 아니란것을 강조하겟다"


객체지향에서 중요시하는것 중 하나는 요구사항의 변화에 따른 프로그램 유연성이다.

조금더 확장해서 말해보자면 새로운 클래스가 추가되어도 프로그램의 다른 영역에는 전혀 변경이 가해지지 않았으면 좋겟다는 생각이 든다는.....

현실세계에서 상속이라 하면 흔히 재산의 상속만을 생각하기 마련이다. 그러나 상속의 대상은 재산뿐만 아니라 한사람의 좋은 품성이나 품행이 될 수도 있는것이다.

" 철수는 아버지로 부터 좋은 목소리와 큰 키를 물려받앗다.(상속 했다.)"

-> 클래스로 보자면

" Student 클래스가 Person 클래스를 상속한다. "

student클래스가 person 클래스를 상속한다. 따라서 student 클래스는 person 클래스가 지니고 있는 모든 멤버 함수와 멤버 변수를 물려받는다.

즉  student 객체는 Student 클래스에 선언 되어 있느 멤버 뿐만 아니라. Person 클래스에 선언 되어 있는 멤버도 지니게 되는 것이다.

class Student : public Person   ->  student 클래스가 person 클래스를 "public 상속 한다는선언


그리고 student 객체 내에는  person 클래스에 선언되어 있는 멤버들도 포함되어 있음을 알 수 있다. <-이것이 상속의 기본 원리이다 
"기존에 정의되어 있는 클래스의 멤버를 새로 정의하는 클래스의 멤버로 포함시키겟다" 란 의미
보통 상속되는 클래스르르 가르켜 Base클래스 상속하는 클래스를 가리켜 Derived클래스 라 표현한다.


상속하고 있는 클래스의 객체 생성 과정

첫째 : 메모리 공간의 할당. 이때 상속되는 클래스를 감안해서 메모리 공간 할당

둘째 : Base 클래스의 생성자 실행

셋째 : Derived 클래스의 생성자 실행


- 처음에 상속되는 클래스(Derived 클래스)의 객체를 생성시   첫째메모리 공간을 할당하게 된다. 이때 Derived 클래스 의 멤버만 생각하는게 아니라 상속하는 클래스 (Base클래스) 의 멤버까지 고려하여서 메모리 공간을 할당하게 된다.
그런다음에 두번째 단계로 생성자를 호출한다. 처음에 Dervied 클래스의 생성자를호출한다. 그다음에 몸체를 실행 시킬려고하니 Base클래스를 상속하는것을 알게된다 그래서 Derived 클래스의 생성자 함수는 호출이 되어있지만 Base의 생성자가 우선적으로 실행되어야 하기때문에  몸체부분을 시작안하고 Base클래스의 생성자를 호출한다. 

-이것이 상속하는 클래스의 객체 생성과정이다.

호출할시에 Derived 클래스의 생성자에서 별다른 서언이 없을때 Base 클래스의 어떠한 생성자를 호출해야 된다는 말이 없을경우 Base클래스의 void  생성자가 호출 및 실행 된다. 그렇다면 void 생성자가 아닌 int형 정수를 인자로 받는 생성자를 호출하고자 하는 경우에는 어떠한 선언을 필요로 하게 될딜까?

->바로 멤버 이닐셜라이저를 사용하면 된다.   

ex) BBB(int j) : AAA(j)           <-  AAA 멤버를 j로 초기화 하라라는 뜻이지만 AAA가 Base 클래스 다 그래서
                // j를 인자로 받을 수 있는 AAA 클래스의 생성자를 호출하라
               // 즉 멤버 이닐셜 라이저를 통해서, 호출하고자 하는 Base 클래스의 생성자
    //를 지정한것이다.  이것을 안하면 그냥 인자없는 생성자를 호출하게 된다.


그렇다면  Base 클래스의 private의 값을 Derived 클래스에서 바꾸려면 어떻게 해야될까??? 

Derived클래스는 상속받아서 그 관계가 이어져 잇기는 하지만 외부 영역이기 때문에 private 로 되어 있는것에 바로 접근할수없다

그렇다면 문제를 어떻게 해결해야될까??

바로 답은 상속하고 있는 객체의 생성 과정에 있다.
ex)  student(int _age, char* _name, char*_major) : Person(_age,_name)
{
strcpy(major,_major)
}
-> 이거 같은경우는 Base클래스인 Person 생성자가 인자값을 위에 걸로 받는걸로 명시했기에 가능..한것이다.

///////////////////////////////////////////////////////////////////////////////////////////////

객체 소멸 과정

소멸은 역시 생성과 반대이다 Derived 클래스 객의 소멸자가 실행 되고 난다음에 Base 클래스의 소멸자가 실행이된다.   그보다 더중요한것은  상속하는 있는 클래스의 객체는 자신이 상속하고 이쓴ㄴ 클래스의 소멸자까지도 호출하는것이다.  이렇게 진행이 되어야 Dervied 클래스의 객체가 소멸될때 Base클래스의 생성자에서 할당한 메모리 공간까지 완벽히 해제할 기회를 얻게 된다고한다.

'C++' 카테고리의 다른 글

상속된 객체와 포인터의 관계  (0) 2009.02.03
상속의 조건  (0) 2009.01.19
클래스...  (0) 2009.01.16
상속을 하는 이유  (0) 2009.01.16
protected 멤버  (0) 2009.01.15
explicit &&&& mutable  (0) 2009.01.15
클래스와 Static  (0) 2009.01.15
클래스와 const  (0) 2009.01.14
복사 생성자가 호출되는 시점  (0) 2009.01.08
복사생성자  (0) 2009.01.08