■ 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
'Coding > C & C++' 카테고리의 다른 글
C++ 연산자 오버로딩 1(기본 연산자, 단항 연산자, << 연산자) (0) | 2020.02.26 |
---|---|
C++ 가상 함수 (0) | 2020.02.25 |
C++ 생성자, 소멸 (0) | 2020.02.21 |
C/C++ 파일 분할과 헤더 파일의 디자인 (0) | 2020.02.18 |
C/C++ 구조체(struct, class) (0) | 2020.02.18 |