오버라이딩

Yama·2024년 1월 12일
0

어소트락 수업

목록 보기
44/55

오버라이딩

  • 게임 예시

    1. 공통적인 몬스터 클래스가 있다(부모)
      • 공격함수, 죽는 함수, 움직이는 함수 등등 존재
    2. 1번을 -> 하늘나는 몬스터, 지상형 몬스터, 유령 몬스터
    3. 1번과 2번을 상속받은 디아루가와 식물이 있다치자.
      • 식물은 부모를 상속받은니 움직이는 함수가 있을것이다 그래서 저 움직이는 함수에 접근해서 움직이게하면 내가원하는 상황이 아니다.
      • 근데 디아루가는 하늘을 날고
      • 근데 이건 부모클래스에서 상속받은 애들은 움직이는 함수가 구현이 다를것이다.
  • 그래서 저런 경우 식물들은 움직임을 예외처리한다거나 디아루가는 하늘나는 움직임이 추가되어야한다 등등 떄문에 오버라이딩이 필요하다.

  • 부모 클래스에 있는 기능(함수)를 자식 클래스에서 재정의 한다.

// 1
class Parent
{
protected:
	int m_Parent;
public:
	// 3
	void OutputMyData()
	{
		cout << "m_Parent : " << m_Parent << std::endl;
	}
    
public:
	Parent() : m_Parent(0) {}
	Parent(int _P) : m_Parent(0) {}
};

// 2
class Child : public Parent
{
private:
	int m_Child;
    
public:
	// 4
	void OutputMyData()
	{
    	// 6
		cout << "m_Parent : " << m_Parent << std::endl;
		cout << "m_Child : " << m_Child << std::endl;
	}
public:
	Child() :m_Child(0) {}
	Child(int _P, int _C) : Parent(_P), m_Child(_C) {}

};
  • 1번은 부모 클래스 2번은 자식 클래스 3번은 출력하는 함수.
	Parent p(10);
	Child c(10, 20);
    // 5
    p.OutputMyData();
    c.OutputMyData();
  • 만약 4번에 OutputMyData함수가 없다고 치고 5번의 함수를 2번 호출 하면 부모의 기능을 그대로 물려받아서 m_Parent만 출력하니 20은 출력이 안된다.
  • 이런경우 오버라이딩을 통해 부모의 기능을 4번처럼 재정의하면 원하는 형태로 출력이 된다.
	Parent::OutputMyData();
  • 기본적으로 Parent::가 생략되어 있어서 컴파일러가 우선순위 보고 컴파일.
  • 부모 클래스에서 받은 OutputMyData함수보다 본인(자식) OutputMyData함수의 기능이 우선순위가 더 높다.
    • 함수가 클래스 객체를 확인하고 그 클래스에 들어가서 우선순위가 더 높은걸로 컴파일 한다.
  • 그러나 내가 재정의를 했지만 부모쪽에 함수를 써야되는 경우가 있을수도있다.
    • 이 순간만큼은 부모쪽에 버전을 써야겠다 이런 경우는 명시적으로 호출해주는 방법이 있다
	c.Child::OutputMyData();
	c.Parent::OutputMyData();
  • Child:: Parent::을 명시적으로 표시해주면 우선순위를 무시하고 그 클래스에 가서 그 클래스에 적힌 함수를 쓴다.
	void OutputMyData()
	{
		Parent::OutputMyData();
		cout << "m_Child : " << m_Child << std::endl;
	}
  • 부모클래스에 있는 기능이 맞지 않아서 재정의를 하거나, 모자란 부분이 있어서 추가 구현을 해야 할 경우.
    • 모자란 부분이 있어서 추가 구현한 코드다.
  • 상용엔진도 부모의 기능을 상속받고 추가구현을 많이한다.
	void OutputMyData()
	{
		cout << "m_Child : " << m_Child << std::endl;
        Parent::OutputMyData();
	}
  • 부모쪽에서 구현이 아래에 갈수도 있당.
  • 내가 새롭게 구현할 기능이 뭔가를 하고 나서 부모쪽에서 상속을 받을수 있다.
  • 내쪽에서 재정의 할려는 내용이 부모에 있는 기능보다 선으로 먼저하고 호출해야될것같은 상황에 쓴다.

정확한 구현 범위를 지정하지 않았다면, 컴파일러는 자식 클래스 쪽에서 오버라이딩한 함수를 호출 시킨다. 그렇다고 부모 클래스에 구현해놓은 원본 함수를 호출할 수 없는 것은 아니다.

강의 코드

main.cpp

#include <iostream>

using std::cout;
using std::endl;

class Parent
{
protected:
	int m_Parent;

public:
	void OutputMyData()
	{
		cout << "m_Parent : " << m_Parent << endl;
	}

public:
	Parent() : m_Parent(0) {}
	Parent(int _P) : m_Parent(_P) {}
};


class Child
	: public Parent
{
private:
	int	m_Child;

public:
	void OutputMyData()
	{
		//cout << "m_Parent : " << m_Parent << endl;
		Parent::OutputMyData();
		cout << "m_Child : " << m_Child << endl;
	}

public:
	Child() :m_Child(0) {}
	Child(int _P, int _C) : Parent(_P), m_Child(_C) {}
};

int main()
{
	Parent	p(10);
	Child	c(10, 20);

	p.OutputMyData();

	c.OutputMyData();
	c.Parent::OutputMyData();


	return 0;
}

1차 24.01.12
2차 24.01.15
3차 24.01.16
4차 24.01.17
5차 24.01.18

0개의 댓글