본문 바로가기

Language/C++

완전 가상함수(일명 개 가상함수)

가상 함수가 왜 필요한지, 이전 Study에서 배웠다~

이번에 완전 가상 함수에 대해서 알아보자.

완전 가상함수는 함수의 정의 없이 함수의 유형만을 Base-class에 기제 해놓은 것을 말한다.

<Type>

virtual return-type Function-name() = 0;

자...이때 완전 가상 함수가 단 하나라도 있는 class를 추상 클레스 라고 불리우며, 이 추상 클레스는 객체 생성이 불가능 하다.

여기서 좀 어렵다.

객체도 생성 할 수 없는 얘를 가지고 멀 하라는거야? 라고 생각이 드는데 맞다. 별로 할껀 없다.ㅡ,.ㅡ;;

이런 클레스는 상속을 목적으로 만들어지며, 주로 인터페이스 만을 제공한다.

음...추상적으로 이해하기 위하여 얘기로 주절거린다면....

다들 책이나 학교에서 상속에 대한 개념을 이해하기 위하여 자동차 클레스를 만이 사용을 할 것이다.

자동차를 최 상위 Base로 두고 클래스를 만든다고 하면, 자동차 클레스는 기본적으로 멤버 변수는 속도, 연료 공급 량, 같은 매우 세부적인 명사들,

그리고, 브레이크를 밟다, 액셀레이터를 밟다. 등의 멤버 함수가 정의가 될 것이다.

그리고 이 자동차를 상속 받아서 중형차, 소형차 등의 클레스를 만들었다면, 이 클레스에는 머...크기, 배기량, 등이 있을 것이고 기본적인 자동차가 가지고 있는 브레이크나 액셀레이터 등의 조작과 그 기능을 하는 것은 상속을 받게 된다.

이때 바로 자동차class 를 추상 클레스로 만들어서 인터페이스(기능)만 제공을 하는 것이다.

먼말인지 알겠는가?

그리고 이 추상 클레스는 일반 객체 생성은 불가능 하지만 포인터 객체 생성을 허용하게 된다. 역시 유연한 프로그래밍을 위한것이다.

이때 주의해야할 사항은 추상 class를 상속 받은 후에는 추상 클래스가 가지고 있는 완전 가상함수를 모두 오버라이딩 해줘야 하며, 오버라이딩이 되어 있지 않으며, 파생 클레스 또한 추상 클레스로 인식이 되어버린다.

이런 기능은 VC++에서 매우 많이 사용이 되며, 큰 프로젝트에서도 꽤나 사용이 된다. ㅎㅎㅎㅎㅎ 나도 이건 사용을 해본 적이 없다.

하지만 MFC를 하면서 매우 많이 봤지~

이전에 Study 했던 Derived class point to Base class point Variable 편을 보면 왜 Point 객체만을 제공하는데 필요한지를 알수 있다.

이 부분은 설명이 매우 애매 하기 때문에 예제 소스 올리겠다.

class base{//추상 클레스
protected:
 int a, b;
public:
 base():a(0),b(0){}
 ~base(){}
 base(int aa,int bb):a(aa),b(bb){}
 //완전 가상 함수 선언.
 virtual void prn() = 0;
 virtual void sum() = 0;
 void addOne(){a++;b++;}
 void addOne(int dd){a+=dd;b+=dd;}

};
class add:public base{
protected:
 int c;
public:
 add(int aa, int bb):base(){a=aa;b=bb;}
 ~add(){}
 void sum(){c = a+b;}
 void prn(){cout<<"\nAdd Print\n";cout<<a<<"+"<<b<<"="<<c<<endl;}
 void addOne(){a++;b++;c = a+b;c++;}

};

void main()
{
 //base base_obj(10,20);
 //추상 클래스 이기 때문에 에러발생

 add add_obj(10,20);

 base *pBase;
 add *pAdd;

 //동적 바인딩으로 저장된 객체 우선 으로 호출
 pBase = &add_obj;

 pBase->sum();
 pBase->prn();
}

물론 말 그대로 예제 소스이기 때문에 왜 사용을 하는지에 대한것을 알수는 없다만, 이런 식으로 사용한다고 생각하면 된다..

 

요즘 나름 일하랴...졸작 하랴...정신이 없다. ㅠㅠ 그래서 문법적인 스터디는 이미 끝이 났지만, 올리는데 시간이 상당히 걸린다.

다음주에는 입출력 스트림과 C에는 없는 C++의 강력한 파일 입출력에 대해서 알아보기로 하자..

 

-C++언어 30일 완선 참조, A-Shell Study team 유창PPT참조-