ݺߣ

ݺߣShare a Scribd company logo
C++ !
http://blog.naver.com/ruvendix
상속의 필요성
잘 만든 클래스를 이용해서 새로운 클래스를 만들고 싶다…
그러려면 기존 클래스의 소스 코드를 복사해야 하는데… 귀찮아…
그래! 소스 코드를 복사하는 작업을 컴파일러에게 맡기자!
그리고 추가되는 것만 소스 코드를 작성하는 거야!
http://blog.naver.com/ruvendix
상속의 모습
class CParent
{
int iMoney;
CParent(void) { }
};
class CChild : public CParent
{
CChild(void) : CParent() { }
};
CChild Child; // 부모 생성자도 호출
Child.iMoney; // 부모의 필드를 사용할 수 있음!
http://blog.naver.com/ruvendix
상속의 범위
다 필요 없고 public 상속만 제대로 알고 있으면 됨!
http://blog.naver.com/ruvendix
클래스 계층도
상속 관계는 계층 구조가 성립됨!
http://blog.naver.com/ruvendix
IS A와 HAS A
상속 관계는 IS A가 적절함!
IS A 관계 HAS A 관계
사람 학생
“사람은 학생이다” 이건 거짓
“학생은 사람이다” 이건 참
이런 관계가 IS A 관계
학생
가방
학생은 가방을 가지고 있다
이런 관계가 HAS A 관계
http://blog.naver.com/ruvendix
객체지향 프로그래밍의 기본 4대 원칙
http://blog.naver.com/ruvendix
정적 바인딩과 동적 바인딩
정적 바인딩 동적 바인딩
int *pNum = &iNum;
컴파일 타임 때 변수의 값이 고정되는 것!
그게 바로 정적 바인딩
int *pNum = &iNum;
cin >> iSelect;
if (iSelect == 1)
{
pNum = &iSelect;
}
런타임 때 변수의 값이 변하는 것!
그게 바로 동적 바인딩
http://blog.naver.com/ruvendix
오버라이딩
오버로딩은 컴파일 타임!
오버라이딩은 런타임!
상속받은 메서드를 재정의하는 것!
그걸 오버라이딩이라고 함!
http://blog.naver.com/ruvendix
상속과 오버라이딩의 문제
부모 포인터로 자식 객체의 주소를 가리킬 수 있음!
문제는… 포인터의 형식이 부모의 형식이므로
자식 객체의 오버라이딩된 메서드를 호출할 수 없다는 것!
http://blog.naver.com/ruvendix
가상 함수(virtual 예약어)
상속 관계의 동적 바인딩이 일어났을 때 오버라이딩된 메서드를
제대로 호출하려면 가상 함수를 이용하라!
class CParent
{
virtual void Talk(void) // 가상 함수 사용
{
cout << “난 부모다!”;
}
};
class Cchild : public CParent
{
virtual void Talk(void) // 가독성을 위한 표시
{
cout << “난 자식이다!”;
}
}
CParent *pParent = new CParent;
pParent.Talk(); // 부모 메서드 호출
delete pParent;
pParent = new CChild;
pParent.Talk(); // 자식 메서드 호출
delete pParent;
Talk()로 2가지의 작업을 선택할 수 있다!
이게 바로 다형성!
http://blog.naver.com/ruvendix
상속과 생성자, 소멸자의 관계
상속을 받으면 반드시 부모 생성자를 호출해야 함!
소멸 과정은 생성 과정과 반대! 자식 소멸자부터 호출!
따라서 동적 바인딩을 위해 소멸자는 가상 함수가 되어야 함!
http://blog.naver.com/ruvendix
순수 가상 함수
부모 클래스에서는 의미가 없지만
자식 클래스에서는 의미가 있는 메서드가 필요하다면?
순수 가상 함수를 이용하라!
class CShape
{
virtual void Draw(void) = 0; // 순수 가상 함수
};
class CCircle : public CShape
{
virtual void Draw(void) // 가독성을 위한 표시
{
cout << “학교에 갔다!”;
}
}
참고로 순수 가상 함수는 본체를 가질 수 있음!
순수 가상 함수는 객체를 생성할 수 없음!
순수 가상 함수가 있는
클래스를
추상 클래스라고 함!
순수 가상 함수만 있는
클래스를
인터페이스라고 함!
http://blog.naver.com/ruvendix

More Related Content

상속과 다형성