해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다.
객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법으로 다른 클래스에서 속성과 특성을 파생시키는 기능을 의미힌다. 여기서 상속을 하는 클래스를 상위 클래스
, 기반 클래스
, 기초 클래스
, 또는 부모 클래스
라고 하고, 상속을 받는 클래스를 하위 클래스
, 파생 클래스
, 유도 클래스
, 또는 자식 클래스
라고 한다. 상속이 이루어지면 유도 클래스는 기초 클래스의 모든 멤버를 물려받는다.
기초 클래스와 유도 클래스 모두 해당 클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 한다. 따라서 유도 클래스의 객체 생성 과정에서는 기초 클래스의 생성자와 유도 클래스의 생성자 둘 다 호출되어야 한다.
스택에 생성된 객체의 소멸순서는 생성순서와 반대이다. 따라서 유도 클래스의 객체가 소멸될 때에는, 유도 클래스의 소멸자가 실행되고 난 다음에 기초 클래스의 소멸자가 실행된다. 그리고 생성자에서 동적 할당한 메모리 공간이 있다면 소멸자에서 해제해주어야 한다.
class 클래스명 : 접근제한자 클래스명
상속을 할 때는 접근 제한자를 지정해줘야 하는데 여기에는 클래스의 멤버를 선언할 때와 마찬가지로 private
, protected
, public
가 있다. private
으로 상속하면 외부에서 해당 클래스에 접근이 불가능하다. protected
로 상속하면 외부에서 접근이 불가능하나 파생 클래스에서는 접근이 가능하고, public
으로 상속하면 어떤 클래스에서나 접근이 가능하다.
허용 접근 범위 : private < protected < public
다중상속이란, 둘 이상의 클래스를 동시에 상속하는 것이다. 다중상속의 방법은 기존의 상속 방법에서 쉼표를 이용해 상속의 되는 클래스를 구분해서 명시하면 된다.
다중상속에는 몇 가지 문제점(모호성)이 발생할 수 있는데 첫 번째는 두 기초 클래스에 동일한 이름의 멤버가 존재하는 경우이고, 두 번째는 다이아몬드 상속의 형태인 경우 동일한 클래스를 간접적으로 두 번 상속한다는 점이다.
첫 번째 문제의 경우, 범위 지정 연산자(::
)를 통해 어느 클래스에 정의된 멤버인지를 명시해주면 문제를 해결할 수 있다.
두 번째 문제의 경우는 가상 상속을 통해 문제를 해결할 수 있다.
가상 상속을 이용하면 유도 클래스의 객체가 생성될 때 기초 클래스의 멤버는 오직 한 번만 생성된다. 즉, 기초 클래스의 멤버가 중복하여 생성되는 것을 방지해주는 것이다.
가상 상속은 virtual
키워드의 선언을 통해 이뤄진다.
class 클래스명 : virtual 접근제한자 클래스명
다이아몬드 상속 형태에서, 동일한 클래스를 가상으로 상속하는 두 클래스를 다중상속하게 되면 중복 상속되는 문제를 해결할 수 있다.
이번 과제에서는 클래스의 상속에 관한 내용을 다루게된다. ex00
에서는 Module 03
에서 계속해서 사용할 기초 클래스인 ClapTrap
을 구현하면 된다. Orthodox Canonical Form
형식에 맞춰 클래스를 정의하고 과제의 요구사항대로 멤버변수는 private
, 멤버함수는 public
으로 선언한다.
ex00
에서 구현한 ClapTrap
클래스를 상속한 ScavTrap
클래스를 구현하면 된다. ex00
에서는 ClapTrap
의 멤버변수를 private
으로 선언했었지만 ex01
에서부터는 상속이 이루어지기 때문에 유도 클래스에서 기초 클래스의 멤버변수에 접근할 수 있도록 위해 ClapTrap
의 멤버변수를 모두 protected
로 수정한다. ClapTrap
과 마찬가지로 Orthodox Canonical Form
형식에 맞춰 ClapTrap
을 public
으로 상속받는 ScavTrap
클래스를 정의하고 생성자에서 ClapTrap
의 생성자도 호출해준다. 마지막으로 ScavTrap
클래스만의 특수 기능인 guardGate()
함수를 정의해주면 된다.
ClapTrap
을 상속받는 또 다른 클래스인 FragTrap
을 구현하면 된다. ex01
과 같은 방식으로 상속하면 된다. 다만 ScavTrap
의 guardGate()
대신 FragTrap
클래스만의 특수 기능인 highFivesGuys()
함수를 정의해야 한다.
ex03
은 ClapTrap
클래스를 상속받은 ScavTrap
클래스와 FragTrap
클래스를 다중상속하여 DiamondTrap
클래스를 만드는 것이 목표이다. 다음과 같은 다이아몬드 상속 형태를 만들어야한다.
이와 같이 ClapTrap
클래스가 중복되지 않고 하나만 생성되기 위해서는 ScavTrap
와 FragTrap
가 ClapTrap
을 가상으로(virtual) 상속하고 DiamondTrap
이 ScavTrap
와 FragTrap
를 다중상속하면 된다.
class ScavTrap : virtual public ClapTrap
{
...
};
class FragTrap : virtual public ClapTrap
{
...
};
class DiamondTrap : public ScavTrap, public FragTrap
{
...
};
마지막으로 DiamondClap
클래스만의 특수 기능인 whoAmI()
함수를 정의해주면 된다.
참고로 컴파일러 플래그로 중 -Wshadow
는 지역변수나 매개변수가 덮어씌워지면 컴파일 시 경고를 해주는 플래그이다. -Wno-shadow
는 -Wshadow
의 경고가 안나오게 해주는 플래그이다.
참고
https://velog.io/@appti/CPP-Module-03-ex00
https://velog.io/@seungju0000/cpp-module-03
https://bigpel66.oopy.io/library/42/inner-circle/14