게임 예시
그래서 저런 경우 식물들은 움직임을 예외처리한다거나 디아루가는 하늘나는 움직임이 추가되어야한다 등등 떄문에 오버라이딩이 필요하다.
부모 클래스에 있는 기능(함수)를 자식 클래스에서 재정의 한다.
// 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) {}
};
Parent p(10);
Child c(10, 20);
// 5
p.OutputMyData();
c.OutputMyData();
OutputMyData
함수가 없다고 치고 5번의 함수를 2번 호출 하면 부모의 기능을 그대로 물려받아서 m_Parent
만 출력하니 20은 출력이 안된다. 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();
}
#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