< C++ >
CAR 클래스에서
TiCo 가 있는데
CAR * P;를 생성, Tico * tp1,2;
tp1 = new Tico; 하면 동적할당이 된다.
tp2 = new Tico; 이런식으로 Tico를 계속 생성하면 주르르륵 늘어나게 되는데,
상위 클래스 Car * p ; 가 Tico 객체를 가르키는 것은 가능하지만
함수가 오버라이드 되어 있으면,
tp1-> left() 와 p-> left() 는 포인터 기반으로 호출되기 때문에
각각 tico 클래스의 left, car 클래스의 left 가 실행된다 (포인터라서 자기가 가리키고있는 점을 기준으로 함)
문제는, Tico의 Left를 호춝하고 싶은데 Car * 로는 불가능하다. 또한
Ray를 만들려면 Ray 의 포인터, Tico의 포인터는 tp 이런애들을 다같이 관리하고 싶은데
객체가 다르므로 같이 묶는게 불가능
그러나 상위클래스의 포인터 는 여기저기(하위클래스)를 다 가르킬 수 있다.
단점이 존재, 각 하위클래스의 함수를 호출하고자 할 때 오버라이드 되어있는 함수는
호출이 안된다. -> 그래서 상위 클래스의 함수에서 Virtual 선언을 해주면 가상화 됨으로 인해서
상위 클래스의 포인터 P를 활용 함수의 호출(같은 이름의 함수라 하더라도) - 객체를 기반으로 바꿔주는
가상화(Virtual)을 사용 시 해당 하위 클래스의 객체 함수를 호출 하게 된다.
CODE <- 키보드 입력에 의해 객체 포인터가 Tico, Ray 의 포인터 변환을 하도록 해놓았다.
P->left() <- 이건 누구의 left() 함수 인가? -> 일단 위의 Code에서 키 입력을 받고
(즉, 프로그램이 실행 될 때 결정.. 그 전까지는 미정이다)
virtual을 사용하지 않으면 static <- 정적인 고정적인 함수가 되어버린다
애초에 컴파일 뜨는 과정에서 p->left(); 는 car의 left가 된다고 이미 정해져 있는 상황이다.
virtual을 활용한 가상화를 시켜놓는 경우에는 ASM 의 call < > 뒤에 뭐가 올지 모른다.
일단 랜덤이지-_-;; 사용자가 뭘 ᅟ누를줄 알아야지
즉 여태까지 우리가 해왔떤 함수의 호출은 static 호출
이와 반대되는 virtual을 활용한 함수의 호출은 dynamic 호출
게임 만들어서 배포를 했는데 해커들이 게임머니,아이템등을 복사를 하려고 하면
소스를 분석해야 하는데, 이런식으로 해놓으면 분석이 힘들다.
즉 쓰면 매우 강력하고 좋은 기능이다
순수 가상 함수
이게 바로 그렇게 이상하게 생각되던 추상 클래스 이다.
추상 클래스는 ->
단독적인 생성은 불가능. 객체도 생성 불가능. 포인터의 생성은 가능하다
또한 위의 예제에서는 순수 가상 함수로 선언된 애들은
반드시 상속받는 애들 (Tico 나 Ray가 구현해줘야 한다)
즉, 추상클래스는 상속받아서 지가 뭘 완성못시키면 지도 못쓴다.
print( )를 구현하지 않으면 결국 K5 도 추상클래스가 된다.=> 즉 추상적인 부분을 없애줘야 한다
순수 가상 함수
1) 이 클래스를 받는 사람들을 반드시 설계하도록 강요하게 된다. 순수 가상 함수 <- 추상화
즉, 구현을 강요.
2) 객체를 생성하지 못하게 틀만 생성 -> 추상화
가상 함수의 호출 시점은 Runtime
static 함수의 호출 시점은 Compile ! 개념을 잘 잡아두자.
가상 소멸자
소멸자의 가상화!
상위클래스 First 의 포인터로 하위 클래스 Second를 동적할당 받고,
삭제를 했는데 First만 소멸되고 Second 동적할당 받은건 어쩔? 좀더 명확히 해보자
분명히 인자 전달 된 것이
Second 에 할당 되어서 출력은 했는데 소멸자는 나오지 않았다.
역시나 마찬가지!
포인터 기반 -> 자료형으로소멸을 시키다보니 객체의 소멸을 시키지 않게 된다.
생성자에게 new를 걸었다고 생각해보자.
동적할당은 받았는데 소멸자가 호출되지 않음으로 인해서 메모리의 누수가 일어나게 된다.
그래서 내 클래스가 언제 하위클래스에서 호출되서 동적할당 될지 모르기 때문에
기본적으로 소멸자는 virtual 로 생성하는 것이 좋다!
이런식으로 해결된다. 이열~~~~~
상위 클래스의 소멸자는 그래서 virtual 로 가상화 하자!
책보고 분석해보자!
다형성 :: 가상함수의 호출관계에서 보인 특성을 다형성,이라 한다
plymorphism ,= 동질이상을 의미하는데 이러한 의미를 띄고 있다
모습은 같은데 형태는 다르다 (문장은 같으네 결과는 다르다)
가상으로 해주는 경우, -> 자식 클래스의 소멸자도 호출되게 된다.
참조자의 참조 가능서 d::
C++에서 AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 / 간접적으로 상속하는 모든 객체를 가리킬 수 있다
C++에서 AAA형 참조자는 AAA객체 또는 AAA를 직접/간접적으로 상속하는 모든 객체를 참조 할 수 있다.
...뭔개솔...그냥 예제 한번 쳐보자
vitual 가상화 함수는 가장 하위 클래스의 함수를 호출 한다~!
<RFID - >
1byte |
|
|
|
|
|
|
|
|
|
|
|
|
|
크기 |
|
|
|
|
|
|
|
|
|
|
|
|
|
최대 255 |
가장 앞의 byte 가 출력되는 것을 확인 할 수 있다
void ISO15693(void * vp)
{
int iCnt;
TCHAR buff[1024];
wsprintf(buff, TEXT("수신된 DATA 크기 : [ %d ]"), ((unsigned char *)vp)[0]);
hdc = GetDC(hWndMain);
TextOut(hdc, 50, 200, buff, lstrlen(buff) );
ReleaseDC(hWndMain, hdc);
}
소스를 조금 수정해보자!
지금은 어느 시점에서 다 읽어 들였는지 모르기 때문에 주구장창 돌아가는 상태다.
이러한 부분을 해소해보자
즉, 마지막까지 읽고 난 뒤에는, 더 이상 읽어들이지 않는다. (버퍼에 TT의 값을 대입하지 않는 것)
이런 방식을 응용하면 모든 상태창을 출력하는 것도 가능하다( 끝에 CRC 는 뽑지 않았다)
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
20141022 일일업무보고서 11번 문대영 (8) | 2014.10.22 |
---|---|
2014년 10월 21일 일일업무 출석번호 9번 김해성 (9) | 2014.10.21 |
RFID 시리얼 통신 소스 (0) | 2014.10.21 |
MDS테크 신입 및 경력 모집 (0) | 2014.10.21 |
2014.10.17 일일 보고서 김진철 (9) | 2014.10.17 |
20141016업무일지 7번 김재성 (9) | 2014.10.16 |
2014년 10월 15일 수업일지 김용우 (7) | 2014.10.15 |
2014.10.14 업무일지 - 김상엽 (9) | 2014.10.14 |