반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 네이버 검색 시스템
- Ultimate Search
- C++
- Python
- algorithm
- 제노블레이드 2
- SRE
- 격리수준
- ASF-110
- Algorithmus
- programmers
- Github
- python3
- 프로그래머스
- 취준
- 알고리즘 종류 정리
- 자소서
- DP
- 코딩테스트
- 프로콘
- 백준
- baekjoon
- 프로콘 갈림현상
- git
- 백트래킹
- 알고리즘
- 리트코드
- GitHub Desktop
- LeetCode
- Pro-Con
Archives
- Today
- Total
산타는 없다
오버라이딩(재정의) 시 주의사항 본문
반응형
일반적으로 상속 시 오버라이딩 할 메소드엔 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로 생성한 것은 파생 클래스의 메소드가 호출되고 아닌 것은 기초 클래스의 메소드가 실행되었습니다.
반응형
'Programming Language > C++' 카테고리의 다른 글
상속 시 생성자와 소멸자 실행순서, 그리고 주의할 점 (0) | 2021.08.17 |
---|---|
C++ 소스 코드 빌드 과정 (0) | 2021.08.02 |
Comments