상속 (C++)

 1. 상속에서 상위 클래스를 (기본 클래스(base class))클래스라고 하고, 

   상속받는 하위클래스를 (파생 클래스(derived class))클래스라고한다.


2. 상속의 장점

[1]간결한 클래스 작성

기본 클래스의 기능을 물려받아 파생 클래스를 간결히 작성


[2]클래스 간의 계층적 분류 및 관리의 용이성

상속은 클래스들의 구조적 관계 파악 용이


[3]클래스 재사용과 확장을 통한 소프트웨어 생산성 향상

빠른 소프트웨어 생산 필요시, 기존에 작성한 클래스의 재사용(상속)을 이용

상속받아 새로운 기능을 확장

그러므로 앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요



3. 상속의 종류 : public, protected, private 상속에 대해서 간략히 설명(page. 387~388)


[1]private

선언된 클래스 내에서만 접근 가능

파생 클래스에서도 기본 클래스의 private 멤버 직접 접근 불가


[2]public

선언된 클래스나 외부 어떤 클래스, 모든 외부 함수에 대해 접근이 허용된다

파생 클래스에서 기본 클래스의 public 멤버 접근이 가능함


[3]protected

선언된 클래스에서 접근 가능

파생 클래스에서만 접근 허용


4. 업캐스팅, 다운캐스팅

[1]업 캐스팅(up-casting)

파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것

(ex)사람을 동물로 봄


[2]다운 캐스팅(down-casting)

기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것



5. 상속관계에서 생성자, 소멸자 호출순서

  

(1) 그림 8-14코드, 실행결과

#include <iostream>

using namespace std;


class A{

 public:

  A(){ cout << "생성자 A" << endl; }

  A(int x){ cout << "매개변수생성자 A" << endl; }

};

class B : public A{

 public:

  B(){ cout << "생성자 B" << endl; }

};


int main(){

 B b;

 

}



 


(2) 그림 8-18코드, 실행결과

 









6. 오버로딩과 오버라이딩 비교 (표9-1, p434)

비교 요소

오버로딩

오버라이딩 

 정의

매개 변수 타입이나 개수가 다르나 이름이 같은 함수들이 중복 작성되는 것

기본 클래스에 선언된 가상 함수를 파생 클래스에서 이름, 매개변수 개수, 매개 변수 타입, 리턴 타입 까지 완벽히 같은 원형으로 재작성함

 존재

외부 함수들 사이, 한 클래스의 멤버들, 상속 관계

상속 관계, 가상 함수에서만 적용 

 목적

이름이 동일한 여러 개의 함수를 중복 작성하여 사용의 편의성 향상 

기본 클래스에 구현된 가상 함수를 무시하는 파생클래스이다.

 바인딩

정적 바인딩, 컴파일 시 중복된 함수들의 호출 구분

동적 바인딩, 실행 시간에 오버라이딩된 함수를 찾아 실행함 

 객체 지향 특성

다형성 

다형성 


 



7. 동적바인딩. (그림 9-6, p425)

 #include <iostream>

using namespace std;


class Shape {

  public :

    void paint(){

      cout <<"Shape::draw() called"<<endl;

    }

};


int main() {

  Shape *pShape = new Shape();

  pShare->paint();

  delete pShape;

 

}


//////// 실행결과

Shape::draw() called




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

 #include <iostream>

using namespace std;


class Shape {

  public :

    void paint(){ 

     draw();

 }

 virtual void draw(){

  cout <<"Shape::draw() called"<<endl; 

 }

};


class Circle : public Shape{

 

 public :

  virtual void draw(){

   cout<<"Circle ::draw()called"<<endl;

  }

};


int main() {

  Shape *pShape = new Circle();

  pShape->paint();

  delete pShape;

 

}



기본클래스에서 자신의 멤버를 호출하더라도 그것이 가상 함수이면 역시 동적 바인딩이 발생


동적 바인딩이 발생하는 구체적 경우

main()과 같은 외부 함수에서 기본 클래스의 포인터로 가상함수 호출

기본 클래스 내의 멤버 함수가 가상 함수 호출

파생 클래스 내의 멤버 함수가 가상 함수 호출

다른 클래스에서 가상 함수 호출

*가상 함수를 호출한다면 , 

 무조건 동적 바인딩을 통해 파생 클래스에 오버라이딩된 가상 함수가 실행된다.


댓글

이 블로그의 인기 게시물

HTML 특정 위치로 링크 걸기

객체포인터와 객체배열, 객체의 동적생성

듀얼쇼크3/Sixaxis PC에서 사용하기 - Windows 7 64bit 지원