cpp 03

jiwoo·2022년 12월 22일
0

cpp

목록 보기
4/9

CPP 03

생성일: 2022년 12월 3일 오전 11:48
최종 편집 일시: 2022년 12월 6일 오후 9:17
태그: cpp
cpp notion

CPP MODULE 03

  • Inheritance
  • 상속!

ex00

ClapTrap class 를 작성한다.

ex01

ClapTrap을 기초 class 로 상속받는 ScavTrap class를 작성한다.

  • 클래스 상속
    • 상속하는 클래스 = 기초클래스, 부모클래스
    • 상속받는 클래스 = 파생클래스, 자식클래스
    • class ScavTrap : public ClapTrap { ... }
  • 파생클래스
    • 파생클래스 만의 생성자가 있어야 한다.
    • 파생클래스 생성시
      • 기초클래스 생성자 호출 → 파생클래스 생성자 호출
    • 파생클래스 소멸시
      • 파생클래스 소멸자 호출 → 기초클래스 소멸자 호출
    • why? [http://www.tcpschool.com/cpp/cpp_inheritance_derivedClass](http://www.tcpschool.com/cpp/cpp_inheritance_derivedClass) http://www.tcpschool.com/cpp/cpp_inheritance_derivedClass
      • 파생클래스가 생성될때 기초를 기초클래스로 하고 있기 때문에 기초클래스 위에 파생클래스가 생성된다고 생각
    • 기초클래스포인터에 담겨있는 new 로 생성한 파생클래스 객체 삭제시, 기초클래스 소멸자 virtual 해주어야 한다.
    • 여기서 아직 요구하는 단계가 아니라 판단하여 가상소멸자로 만들지는 않았다. (04에서 가상함수를 다룬다.)
      • delete 시 프로그램은 파생 클래스의 소멸자만 실행하기 때문이다.
        		ClapTrap	*i = new ScavTrap("hello");
        		delete i;
        		std::cout << std::endl;
  • ClapTrap class의 private → protected
    • 파생클래스에서 멤버변수에 접근 가능하도록 하기 위해서 변경하였다.
  • private, protected, public 범위
    • private
      • private 멤버는 클래스 외부에서 접근 불가능하다.
    • protected
      • protected 멤버는 클래스 외부에서 접근 할 수 없지만, 상속받는 클래스에서는 접근 가능하다.
    • public
      • public 멤버는 클래스 외부에서 접근할 수 있다.
    • https://www.w3schools.com/cpp/cpp_access_specifiers.asp

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
      • -Wshadow 가 적용되지 않도록 한다.

0개의 댓글