티스토리 뷰

객체 포인터

-> 1. 파생 클래스의 객체를 가리키는 기본 클래스의 객체 포인터를 사용할 수 있음.

-> 2. 기본 클래스의 객체를 가리키는 파생 클래스의 객체 포인터는 사용할 수 없음.


 class Animal {

      public:

         void breathe();

   };

 

   class Fish : public Animal {

      public:

         void breathe();

   };

 

   Animal* a = new Fish;       // 1. 가능

   Fish* f = new Animal;       // 2. 불가능


-> 3. a->breathe();를 호출하면, class Animal(기본클래스)의 breathe() 함수가 호출 됨.



가상 함수(virtual function)

-> 상속 관계에 있는 클래스를 객체 포인터 형태로 사용할 때 의미가 있음.

-> 실행 시점에서 수행할 영역이 정해지므로 융통성 있는 개발이 가능.

-> 동적 결합 방식으로 실행됨.

-> 객체 포인터의 3번 사항을 해결하는데 이용.


순수 가상함수 : 가상 함수의 선언만 존재. 실제 구현부가 없는 가상함수.

-> 기본 클래스 작성 시 파생 클래스에서 반드시 구현해야 하는 기능에 대한 선언을 미리 해둠

-> virtual void breathe() = 0;


추상 클래스 : 순수 가상함수를 포함하고 있는 클래스

-> 아직 정의되지 않은 멤버함수를 가지고 있어 객체를 생성할 수 없음

-> 파생 클래스를 정의하고, 순수 가상함수를 구현하여 객체 생성


========> 추상 클래스를 상속받아 작성되는 파생 클래스에서 순수 가상함수 구현 시 파생 클래스에서 객체 생성이 가능. 추상 클래스의 포인터는 파생 클래스의 객체를 가리킴


class cMain

{

public:

virtual void TestFun() = 0;

};


class cSub : public cMain

{

public:

void TestFun();

};


void cSub::TestFun()

{

printf("cSub!\n");

}


void main()

{

cMain *test = new cSub;


test->TestFun();

}


가상 소멸자 (virtual destructor)

-> 기본 클래스의 객체 포인터가 파생 클래스의 객체를 가리키고, 그 포인터를 통해 객체를 제거했을 때, 파생 클래스의 소멸자까지 호출되도록 하려면 기본 클래스의 소멸자를 가상소멸자(virtual destructor)로 지정.


class Animal {

      public:

         Animal();

         virtual ~Animal();

   };

 

   class Fish : public Animal {

      public:

         Fish();

         virtual ~Fish();                // ~Fish();

   };


=====> delete 명령이 실행되면, 파생 클래스의 소멸자 -> 기본 클래스 소멸자 순으로 실행됨.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함