CPP 03
생성일: 2022년 12월 3일 오전 11:48
최종 편집 일시: 2022년 12월 6일 오후 9:17
태그: cpp
cpp notion
CPP MODULE 03
ex00
ClapTrap class 를 작성한다.
ex01
ClapTrap을 기초 class 로 상속받는 ScavTrap class를 작성한다.
- 클래스 상속
- 상속하는 클래스 = 기초클래스, 부모클래스
- 상속받는 클래스 = 파생클래스, 자식클래스
class ScavTrap : public ClapTrap { ... }
- 파생클래스
- 파생클래스 만의 생성자가 있어야 한다.
- 파생클래스 생성시
- 기초클래스 생성자 호출 → 파생클래스 생성자 호출
- 파생클래스 소멸시
- 파생클래스 소멸자 호출 → 기초클래스 소멸자 호출
- why?
http://www.tcpschool.com/cpp/cpp_inheritance_derivedClass
- 파생클래스가 생성될때 기초를 기초클래스로 하고 있기 때문에 기초클래스 위에 파생클래스가 생성된다고 생각
- 기초클래스포인터에 담겨있는 new 로 생성한 파생클래스 객체 삭제시, 기초클래스 소멸자 virtual 해주어야 한다.
- 여기서 아직 요구하는 단계가 아니라 판단하여 가상소멸자로 만들지는 않았다. (04에서 가상함수를 다룬다.)
- ClapTrap class의 private → protected
- 파생클래스에서 멤버변수에 접근 가능하도록 하기 위해서 변경하였다.
- private, protected, public 범위
ex02
ClapTrap을 기초 class 로 상속받는 FragTrap class를 작성한다.
- ScavTrap 과 동일하게 상속받도록 작성하되, 다른 기능의 함수를 하나 추가한다.
ex03
ClapTrap을 상속받고 있는 두개의 클래스 ScavTrap과 FragTrap 를 상속받는 DiamondTrap class를 작성한다
- 다중상속
- 다중상속은 둘 이상의 클래스를 상속하는 형태이다.
- 위험
- 다중상속은 다양한 문제를 동반 하기 때문에 사용하지 않는 것이 좋다는 의견이 대다수이다.
- 같은 기본클래스를 여러개 상속 받을 수 있는 문제
- 상속받은 서로다른 클래스들에 같은 형식, 이름의 멤버함수 및 변수 가 있을 수 있는 문제
- 가상상속
class ScavTrap : **virtual** public ClapTrab{ ... }
class FragTrap : **virtual** public ClapTrab{ ... }
class DiamondTrap : public ScavTrap, public FragTrap { ... }
- DiamondTrap 클래스 생성시 초기화 리스트에서 ClapTrap() 생성자를 불러와주어야 한다.
- 기본 클래스의 멤버가 중복하여 생성되는 것을 방지한다.
- ScavTrap과 FragTrap 은 각각 ClapTrab을 상속 받고 있기 때문에 가상상속을 하지 않았을 경우, 이 두 class를 상속받는 DiamondTrap class는 두개의 ClapTrab을 가지게 된다.
이 상황에서 ClapTrab의 멤버를 호출할 때 두 개의 클래스중에서 무엇을 호출할지 모호한 상황에 처한다. 가상상속은 이러한 문제를 방지한다.
- 플래그
-Wshadow
- 선언된 변수명을 다른 scope 에서 다시 선언한 경우 경고를 발생시킨다. 이렇게 변수가 선언될 경우 이것을 shadowing 변수라고 한다.
-Wno-shadow