윔딩 규칙 : 😲 닀형성을 위한 상속의 겜우, 반드시 가상 소멞자륌 만듀자.

볎묌찜고·2022년 8월 20음
0

c++ basic 윔드누늬

목록 볎Ʞ
36/50

ê²°ë¡ 
: 닀향성을 위한 상속은 반드시 가상 소멞자륌 반드시 작성하자!
읎유 :
업캐슀팅을 할 겜우, c++의 Ʞ볞정책읞 정적바읞딩윌로 읞핎 객첎는 baseType윌로 결정되얎서 객첎 핎제시 base 소멞자가 혞출된닀.
하지만 virtual 킀워드륌 소멞자에 작성하멎 동적바읞딩윌로 읞핎 객첎는
derivedType윌로 결정되얎서 객첎 소멞시에 파생큎래슀의 소멞자가 혞출된닀.

하지만!
닚독윌로 사용되는 큎래슀는 할 필요 없음.
였히렀 가상 포읞터 하나가 메몚늬에 생성되Ʞ 때묞임.

킀워드

1) virtual 킀워드

  • 파생큎래슀에 동적바읞딩 하게 하는 킀워드
  • 파생 큎래슀에서는 êž°ë°˜ 큎래슀의 핚수륌 재정의했닀는 것을 명시하Ʞ
    위핎 붙읎는 것읎 좋음.

2) override 킀워드
: c++11 부터 나왔음.

  • 파생 큎래슀의 재정의 핚수 뒀에 붙여서 재정의핚을 명시하는 것읎 좋음.
    but , c++11부터 나왔윌므로 명시되지 않는 핚수듀읎 졎재할 수 있음.

3) final 킀워드
: 파생 큎래슀에서 가상핚수륌 재정의 할 수 없도록 하Ʞ위한 킀워드

  • 작성된 파생큎래슀 륌 또 파생할 겜우, 2번짞로 파생한
    큎래슀는 재정의가 불가핚.

4) cpp와 헀더 구분시,
: 위의 3개의 킀워드는 선얞부에만 표Ʞ하고, 구현부에는 표Ʞ하지 말자.

🔥가상 소멞자.🔥

https://online-unreal.tistory.com/77
https://leemoney93.tistory.com/63

  • ㄱㅅㅁㅈㅊㅈ

가상 소멞자는 닀향성을 추구하는 큎래슀에만 붙여알 핹.

닚독윌로 사용되는 큎래슀에는 궅읎 붙음 필요 없음.
였히렀 가상 핚수 포읞터한개가 메몚늬에 추가될 뿐.

- 가상 소멞자륌 í•Žì•Œ 하는 읎유
: c++의 Ʞ볞 바읞딩은 정적바읞딩읎Ʞ 때묞에,
업캐슀팅 시에는 파생 타입읎 아닌 Base 큎래슀 타입윌로 결정됚,(슉 포읞터 타입)
객첎 핎제시 정적바읞딩에 의핎 base 큎래슀의 소멞자가 혞출된닀.
- 귞래서 얎떻게 할 것냐멎?
싀행 시간에 싀제 큎래슀의 핚수륌 혞출할 수 있게 하는 virtual 킀워드륌 사용하자. 읎륌 동적 바읞딩읎띌고 한닀.
파생 큎래슀의 타입윌로 결정하Ʞ 위핎서는 동적바읞딩을 í•Žì•Œ 한닀.
virtaul 킀워드륌 작성하Ʞ만 하멎된닀.
base 큎래슀와 derived 큎래슀의 소멞자에 virtual 킀워드륌 작성하자.
derived 큎래슀의 생성자 진입시 vTable에 파생큎래슀 소멞자의 포읞터가 Ʞ록된닀.
읎로 읞핎 업캐슀팅 객첎 소멞시 derived 객첎의 소멞자가 혞출된닀.
- 귌데 궁ꞈ한 것읎 Ʞ졎의 virtual 핚수와는 닀륎게 가상 소멞자는 왜 마지막에 base 소멞자도 혞출할까?
: 읎거는 소멞자의 특성을 따륎Ʞ 때묞읎닀.
소멞자는 후늬 영역에서 부몚 큎래슀의 소멞자와 멀버 객첎의 소멞자륌 혞출하Ʞ 때묞읎닀.

vTable의 동작원늬에 대핮

  • ì°žê³ ë¡œ virtual 킀워드륌 작성하자마자 생성되는 핎당 큎래슀에는 하나의 vTable읎 만듀얎지고, virtual 선얞된 핚수의 포읞터륌 Ʞ록하게 된닀.
    파생큎래슀에 재정의된 핚수가 있닀멎, 파생큎래슀의 생성자에 진입하는 순간
    virtual 재정의 핚수륌 볎고 vTable에 핎당 재정의 핚수의 포읞터륌 Ʞ록한닀. 슉 Ʞ볞 큎래슀의 virtual 핚수의 포읞터가 덧씌워지는 형식윌로 진행됚.

problem

가) 가상 소멞자 없읎 업캐슀팅 í•Žì„œ , 파생읎의 소멞자가 혞출되는지륌
확읞하띌.

-> 파생 큎래슀의 소멞자가 혞출되지 않음.

만앜에 Ʞ반곌 파생 생성자에서 동적할당하고, 소멞자에서 각각 핎지한닀고 한닀멎? -> 파생 큎래슀의 소멞자 혞출되지 않윌므로, 메몚늬 누수 발생핚.

나) 가상 소멞자륌 만듀얎 볎고 출력하띌.

-> 가상 소멞자륌 만듀얎서 , 소멞자가 혞출됚을 확읞핚.
신Ʞ한것읎 닀륞 가상핚수듀곌는 닀륎게 재정의된 파생소멞자만 혞출핎알 하는데, 지ꞈ의 겜우, 부몚 소멞자도 혞출하고 있닀.
읎유는 위에닀가 작성핚.

ê²°ë¡ 

: 닀향성 상속을 구현한닀고 할때, 반드시 êž°ë°˜ 큎래슀의
소멞자는 가상핚수로 만듀얎알 핹.

: 상속읎 용도가 아닌 , 닚독윌로 사용되는 큎래슀는
가상 소멞자 작성하멎 안됚!
-> 가상 핚수 포읞터 한개가 포핚되Ʞ 때묞


가상 핚수의 혞출 원늬

가상 핚수 포읞터

: êž°ë°˜ 큎래슀에서 가상핚수가 있을 겜우 생성됚.

  • 가상핚수 포읞터는 객첎 생성할때마닀 만듀얎지고, 읎때 공용의 가상핚수 테읎랔을 찞조하고 있닀. 귞늬고 객첎에서 가상핚수 혞출시, 핎당 객첎의 죌소 thiscall 을 통핎서 혞출읎 읎룚얎진닀. (funda c++ ì°žê³ )

  • êž°ë°˜ 큎래슀의 생성자, 파생 큎래슀 생성자 순서로 진입하멎서
    ì–Žë–€ 핚수의 포읞터륌 가늬킬 것읞지에 대한 것을 ê²°ì •í•š.

  • 읎 때 파생큎래슀의 였버띌읎딩 핚수의 죌소가 덮얎썚짐.

가상 핚수 테읎랔

: 가상핚수의 죌소가 저장되얎 있는 테읎랔

  • 가상 핚수 테읎랔은 컎파음시에 큎래슀마닀 한개씩 만듀얎진닀.
    객첎마닀 생성되는 것읎 아니닀. (funda c++ ì°žê³ )

  • 가상 핚수 포읞터가 읎 테읎랔을 ì°žì¡° 하고 있음.

  • 가상 핚수 혞출시, vptr 읎 vtable을 ì°žì¡° 하고,
    vTable에 Ʞ록된 죌소의 핚수륌 혞출핚.

메몚늬 사용량곌 성능

  1. 메몚늬 사용량,
  • 가상 핚수 테읎랔에는 가상핚수의 죌소가 저장되므로 용량읎 컀짐
  • 객첎당 한 개의 가상 핚수테읎랔을 가늬킀는 포읞터가 추가됚
    : 4바읎튞 또는 8바읎튞
  1. 성능
    -가상 핚수 혞출 시, 싀행시간에 vptr읎 vTable을 ì°žì¡° 후,
    혞출하므로 였버헀드 발생핚.
  • 가상 핚수는 싀행 시간에 처늬되므로, inline읎 불가능핚.
profile
🔥🔥🔥

0개의 댓Ꞁ