은닉성: 캡슐화
숨기는 이유 -> 위험하고 건드리면 안되는 경우, 다른 경료로 접근하길 원하는 경우
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 -> 자신이 직접 구현해서 사용한다.
순수 가상함수로 만드는 순간 클래스는 추상 클래스로 간주함
직접적으로 객체를 만들수 없고 무조건 자식이 순수 가상함수를 정의해야함.
추상 클래스라 부모 클래스 단독 객체 생성이 불가능..
'c++' 카테고리의 다른 글
C++ 개인 필기(11) 클래스의 연산자 (0) | 2024.02.07 |
---|---|
C++ 개인 필기(10) 초기화 리스트 (0) | 2024.02.06 |
C++ 개인 필기(8) 객체지향 생성자 (0) | 2024.01.31 |
C++ 개인 필기(7) 생성자 소멸자 (1) | 2024.01.26 |
C++ 개인 필기(6) 다중 포인터 및 배열 (2) | 2024.01.25 |