산타는 없다

오버라이딩(재정의) 시 주의사항 본문

Programming Language/C++

오버라이딩(재정의) 시 주의사항

LEDPEAR 2021. 8. 17. 23:16
반응형

일반적으로 상속 시 오버라이딩 할 메소드엔 virtual을 붙여서 프로그램이 파생 클래스의 메소드를 호출할 수 있도록 알려줍니다.

하지만 이를 붙이지 않거나 객체를 new로 생성하지 않았을 때는 어떻게 될까요?


virtual을 붙이지 않았을 때

virtual을 붙이지 않았을 때는 참조형이나 포인터형에 기초하여 메서드가 호출되기 때문에 기초 클래스의 메서드가 실행됩니다.


객체를 new로 생성하지 않았을 때

객체를 new로 생성하지 않았을 때는 무조건 객체형을 따라가게 됩니다.

객체형에 들어간 객체가 파생 클래스여도 기초 클래스의 메서드가 실행되게 됩니다.


테스트

기초 클래스와

class people
{
private:
	string name;
	int age;
public:
	people(string inputName, int inputAge)
	{
		name = inputName;
		age = inputAge;
	}

	void printInfo()
	{
		cout << "name : " << name << '\n';
		cout << "age : " << age << '\n';
	}
};

파생 클래스를

class player : public people
{
private:
	string job;
public:
	player(string inputName, int inputAge, string inputJob)
		: people(inputName, inputAge)
	{
		job = inputJob;
	}

	void printInfo()
	{
		people::printInfo();
		cout << "job : " << job << '\n';
	}

	void playerInfo()
	{
		cout << "player job : " << job << '\n';
	}
};

이와 같이 선언하였습니다.

오버라이드 할 메서드가 기초 클래스에서 virtual로 선언되지 않았기 때문에 이 상황에선 무조건 기초 클래스의 메소드가 호출됩니다.

하지만 오버라이드 할 메서드를 기초 클래스에서 virtual로 선언한다면

class people
{
private:
	string name;
	int age;
public:
	people(string inputName, int inputAge)
	{
		name = inputName;
		age = inputAge;
	}

	void virtual printInfo()
	{
		cout << "name : " << name << '\n';
		cout << "age : " << age << '\n';
	}
};

`

동일한 코드로 실행해도 결과는 다르게 나옵니다.

앞서 말씀드린것과 같이 객체를 new로 생성한 것은 파생 클래스의 메소드가 호출되고 아닌 것은 기초 클래스의 메소드가 실행되었습니다.

반응형
Comments