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로 생성한 것은 파생 클래스의 메소드가 호출되고 아닌 것은 기초 클래스의 메소드가 실행되었습니다.
반응형