본문 바로가기

강의자료/Class

005. 함수 오버로딩(중첩)과 함수 오버라이딩(재정의)의 차이.

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


아래 코드를 실행하여 함수 오버로딩과 함수 오버라이딩을 완벽하게 이해하고, 그 활용법에 대해서 파악한다.
/*
○ 함수 오버로딩(중첩) : 이름은 같지만 인자가 다른 함수를 다수 정의하여 하나의 함수로 다수의 함수를 이용할 수 있게 하는 것.
○ 함수 오버라이딩(재정의) : 클래스의 상속관계에서 부모클래스와 자식클래스에서 이름이 같은 함수를 작성하는 것.
====================================================================================================================
○ 함수 오버라이딩(재정의) 상세설명.
- 자식 클래스에서 부모 클래스의 함수 구현부를 새로이 만드는 것
- 함수의 이름만 같으면 오버라이딩이 된다.
○ 부모 클래스의 하나의 함수를 재정의하면 동일한 이름을 가진 부모 클래스의 모든 함수(오버로딩된 모든 함수)를 은폐 시키게 됨
○ 부모 클래스의 함수가 재정의 되어 은폐되었더라도 함수의 호출 경로를 완전하게 써주면 호출할 수 있음(예,자식클래스의객체명.부모클래스명::함수명();)
*/

#include 
using namespace std;

class Mammal
{
public:
	void Move() const 
	{ 
		cout << "Mammal move one step\n"; 
	}
	void Move(int distance) const
	{
		cout << "Mammal move " << distance;
		cout << " steps.\n";
	}
};

class Dog : public Mammal
{
public:
	void Move() const
	{
		cout << "Dog move...\n";
	}
	void Run() const
	{
		for(int i=0; i < 5; i++)
		{
			//Move();		// 자기 자신의 Move()함수를 사용하고자 할 경우,
			Mammal::Move(); // 부모의 Move()함수를 사용하고자 할 경우,
		}
	}
};

void main()
{
	Mammal bigAnimal;
	bigAnimal.Move( );
	bigAnimal.Move(2);

	Dog fido;
	fido.Move( );
	//fido.Move(6);	// 에러발생 : 오버라이딩한 경우, 부모의 모든 Move()함수에 접근 불가능하다.
	fido.Mammal::Move(6); // 함수의 호출경로를 완전하게 적어서 은폐된 함수를 호출한다.
}