상속에 대해 알아봅시다.
ex00
ClapTrap으로 부르는 클래스를 만들고 이 클래스는 다음의 private 값을 지정한 값으로 초기화해야한다.
- 생성자에 파라미터로 받는 이름
- claptrap의 건강을 표현하는 Hit point (10)
- 에너지 포인트 10
- 공격 데미지 0
다음의 public 멤버 함수를 넣어라
- void attack(const std::string& target);
- void takeDamage(unsigned int amount);
- void beRepaired(unsigned int amount);
아ㅏㅏㅏ 영어 싫다 그만 해석하고 싶다ㅏ
클랩트랙 공격 시 대상에게 <공격 데미지> 체력을 잃게 한다.
클랩트랩이 스스로 복구하면 체력이 <amount>만큼 회복됩니다. 공격과 수리에 각각 1개의 에너지 포인트가 듭니다. 물론, ClapTrap은 히트 포인트나 에너지 포인트가 남지 않으면 아무것도 할 수 없다.
이러한 모든 구성원 기능에서 발생하는 일을 설명하는 메시지를 인쇄해야 합니다. 예를 들어, attack() 함수는 다음과 같이 표시할 수 있다.
ClapTrap <name> attacks <traget> , causing <demage> points of damage!
피어 평가자가 호출된 내용을 쉽게 확인할 수 있도록 생성자와 소멸자도 메시지를 표시해야 합니다.
자체 테스트를 구현하고 제출하여 코드가 예상대로 작동하는지 확인하십시오.
파파고 최고
ex01
claptrap이 충분하지 않기때문에 파생로봇, Scavtrap을 만들겁니다. 이 로봇은 claptrap의 생성자와 소멸자를 상속받습니다.
그러나 이 로봇의 생성자, 소멸자, attack()은 다른 메세지를 출력합니다.
after all, claptrap are aware of their individuality. (?)
생성자와 소멸자으 ㅣ적절한 관계가 test에서 보여져야합니다.
ScavTrap이 생성될 떄 프로그램은 claptrap을 만드는 것부터 시작합니다. 소멸자는 거꾸로 나옵니다. 왜일까요?
Scavtrap은 Claptrap의 값을 사용합니다.
- 생성자에 이름을 파라미터로 받기
- hit point -> 100점으로 초기화
- energy -> 50
- attack -> 20
ScavTrap만의 함수
- void guardGate();
- 이 멤버함수는 ScavTrap이 이제 문지기모드라는 것을 알려주는 메세지를 출력합니다.
- test 짜세융
# 상속 (Inheritance)
상속관계에 있는 두 클래스 A, B
B가 A를 상속받았다고 하면 B는 A의 속성을 모두 가지면서 B만의 속성을 추가적으로 가진다.
이때 A(부모)를 기본 클래스, base class / B(자식)를 파생 클래스(derived class)라고 부른다.
c++은 여러개의 클래스를 동시에 상속받는 다중 상속(multiple inheritance)가 가능하다.
기본클래스를 상속받는 파생클래스의 경우 다음과 같이 정의한다.
class B : public A {
// 기본클래스 앞에 반드시 상속 접근을 지정해야한다.
// # 상속 접근
// 기본 클래스를 다음과 같이 상속 받으면
// - public
// - 기본클래스의 멤버들이 접근지정 변경없이 파생클래스에 상속된다.
// - protected
// - 기본 클래스의 protected, public 멤버들이 모두 protected로 변경되어 파생클래스에 상속된다.
// - private
// - 기본 클래스의 protected, public 멤버들이 모두 private로 변경되어 파생클래스에 상속된다.
// 상속접근을 따로 지정하지 않으면 private으로 처리된다.
};
- 상속을 통해서 같은 동작을 하는 코드를 줄일 수 있다. -> 코드의 간결화
- 서로 관련된 클래스를 계층 관계로 표현하여 클래스들의 구조를 쉽게 파악할 수 있다.
- 클래스의 재사용과 확장을 통해 소프트웨어의 생산성을 향상한다.
파생클래스의 멤버들은 기본 클래스에서 private으로 선언된 멤버외에 모든 멤버들에게 접근할 수 있다.
- 파생클래스의 멤버들은 기본클래스의 private 멤버들에게 접근할 수는 없지만 기본 클래스의 private 멤버들도 파생클래스에 상속되고, 파생클래스의 객체에도 포함되어 있다.
- 업캐스팅 (up-casting)
- 파생 클래스의 객체를 기본 클래스의 포인터로 가리키는 것
- 형식 : (기본클래스 타입) *변수명 = 파생클래스객체를 가리키는 포인터변수;
- 업캐스팅한 기본 클래스의 포인터로는 기본 클래스의 멤버만 접근할 수 있다.
- 다운캐스팅
- 파생 클래스의 포인터로 기본 클래스 포인터가 가리키는 객체를 가리키는 것
- 형식 : (파생클래스 타입) * 변수명 = (파생클래스 타입 *) 기본클래스포인터 ;
- 다운 캐스팅은 강제적인 타입변환을 해야한다.
- protected
- 기본 클래스에 protected로 지정된 멤버는, 파생 클래스는 접근할 수 있고 그 외의 다른 클래스나 외부 함수는 접근할 수 없다.
- 파생 클래스와 기본 클래스의 생성자 호출 및 실행 관계
- 파생클래스의 객체가 생성될 때 기본클래스와 파생클래스의 생성자가 모두 실행된다. 호출은 파생클래스의 생성자가 먼저 되지만 파생클래스의 생성자가 실행되기 전 기본 클래스의 생성자를 호출하고 난 뒤, 기본 클래스의 생성자가 먼저 실행되어 기본 클래스의 멤버등의 초기화를 수행하고 파생 클래스의 생성자가 실행되어 파생클래스의 멤버등을 초기화한다.
- 소멸자또한 상속 관계에 있는 모든 클래스의 소멸자를 실행하게 되는데, 소멸자의 실행 순서는 생성자와는 반다로 이루어진다. 파생클래스의 소멸자를 실행한 후 기본클래스의 소멸자를 호출하여 실행하게 된다. (by compiler)
ex02
FragTrap
이제 claptrap을 상속받는 fragtrap을 구현할겁니다. 이건 Scavtrap과 비슷하지만 생성자와 소멸자가 출력하는 메세지가 다릅니다. 적절한 생성자오 ㅏ소멸자의 관계를 test에서 보여주세요. fragtrap이 생성되면 프로그램은 claptrap을 먼저 만들기 시작합니다. 소멸자는 그 반대죠
속성은 위와 같습니다만 이번에는 값이 달라요
- 생성자에 파라미터로 받는 name
- hitpoint 100
- energy 100
- attack demage. 30
그리고 fragtrap만의 특별한 능력
- void highFivesGuys(void);
- 이 멤버 함수는 가능한 하이파이브요청을 표준출력으로 출력합니다.
- 이 멤버 함수는 가능한 하이파이브요청을 표준출력으로 출력합니다.
세계 공용어 한국어 해줘라
'42seoul > circle-4' 카테고리의 다른 글
[ CPP05 ] 0. 과제이해하기 (0) | 2022.08.03 |
---|---|
[ CPP04 ] 0. 과제이해하기 (0) | 2022.08.02 |
[NetPractice] 01. need to know (0) | 2022.07.31 |
[ CPP02 ] 0. 과제이해하기 (0) | 2022.07.30 |
[ CPP01 ] 0. 과제 이해하기 (0) | 2022.07.28 |
댓글