본문 바로가기
코스웨어/14년 스마트컨트롤러

20141020월요일 업무일지 출석10번 김화린

by 알 수 없는 사용자 2014. 10. 21.
728x90
반응형

< 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 가 실행된다 (포인터라서 자기가 가리키고있는 점을 기준으로 함)

 

문제는, TicoLeft를 호춝하고 싶은데 Car * 로는 불가능하다. 또한

Ray를 만들려면 Ray 의 포인터, Tico의 포인터는 tp 이런애들을 다같이 관리하고 싶은데

객체가 다르므로 같이 묶는게 불가능

그러나 상위클래스의 포인터 는 여기저기(하위클래스)를 다 가르킬 수 있다.

 

단점이 존재, 각 하위클래스의 함수를 호출하고자 할 때 오버라이드 되어있는 함수는

호출이 안된다. -> 그래서 상위 클래스의 함수에서 Virtual 선언을 해주면 가상화 됨으로 인해서

상위 클래스의 포인터 P를 활용 함수의 호출(같은 이름의 함수라 하더라도) - 객체를 기반으로 바꿔주는

가상화(Virtual)을 사용 시 해당 하위 클래스의 객체 함수를 호출 하게 된다.

 

CODE <- 키보드 입력에 의해 객체 포인터가 Tico, Ray 의 포인터 변환을 하도록 해놓았다.

 

P->left() <- 이건 누구의 left() 함수 인가? -> 일단 위의 Code에서 키 입력을 받고

(, 프로그램이 실행 될 때 결정.. 그 전까지는 미정이다)

virtual을 사용하지 않으면 static <- 정적인 고정적인 함수가 되어버린다

애초에 컴파일 뜨는 과정에서 p->left(); carleft가 된다고 이미 정해져 있는 상황이다.

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 는 뽑지 않았다)

728x90