c++

C++ 개인 필기(9) 은닉성 다형성

Voitcon 2024. 2. 1. 20:00

은닉성: 캡슐화

숨기는 이유 -> 위험하고 건드리면 안되는 경우, 다른 경료로 접근하길 원하는 경우

public, protected, private -> 멤버 접근 지정자

private -> class 내부에서만

class Warrior : public Player -> 상속 접근 지정자

protected -> class에 상속된 class에서만 사용이 가능하다.

상속 접근 지정자 -> 자식 class에 꼭 모든걸 물려줘야하는 것이 아니다.

Warrior : protected Player -> public -> protected로 변환 부모는 public 자식은 protected

// : priavte Player -> 부모만 public, 자식은 private-> 자식의 자식은 사용 불가능

 

다형성 -> 겉은 같은데 기능은 다름

오버로딩 : 함수 중복 정으;

오버라이딩 : 부모 클래스의 함수는 자식 클래스에서 재정의

 

kill Player(Player *p) -> kill Player(&p) -> p.kill()

p->kill -> player is player -> ok

kill Warrior(Warrior *w) -> kill Warrior(&w) -> w.kill()

-> Warrior is warrior -> ok

if kill Warrior(&p) -> error

is player warrior? -> no

parent -> child (x) / child -> parent(o)

kill Player(&w) -> error x

warrior is player -> yes

바인딩 -> 정적 바인딩(컴파일 시점) / 동적 바인딩(실행시점)

바인딩 -> 어떤 함수를 호출해야 하는지 그 함수와 주소를 매핑해서 연결 하는것.

일반 함수 : 정적 바인딩 사용

killplayer(player *p) -> killplayer(&w) -> p->killplayer 실행됨 -> 정적 바인딩이기때문에 (일반함수로 묶여있어 컴파일 시점에서 정해짐)

 

동적 바인딩을 원한다면 -> 가상 함수 사용(virtual)

virtual void kill();

가상함수는 재정의를 하더라도 여전히 가상함수.

 

가상함수가 추가되면 메모리도 추가된다.

-> 가상함수 테이블이 안들어진다(vftable)

-> 4바이트 (32bit) 8바이트 (64bit)

->클래스의 자기 자신의 가상함수 테이블은 선처리 영역에서 세팅함 player(부모) warrior(자식)일때 자신의 선처리 부분에서 (생성자) player(생성자 호출후 자신의 vf 테이블로 덮어씀) 

순수 가상함수(구현은 없고 인터페이스만 전달)

->virtual void attack() abstract; 

virtual void attack=0 -> 자신이 직접 구현해서 사용한다.

순수 가상함수로 만드는 순간 클래스는 추상 클래스로 간주함

직접적으로 객체를 만들수 없고 무조건 자식이 순수 가상함수를 정의해야함.

추상 클래스라 부모 클래스 단독 객체 생성이 불가능..