일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- R
- 직장인인강
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- SKT
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- 패스트캠퍼스후기
- albert
- 패스트캠퍼스
- AI
- 직장인자기계발
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 알버트
- 패캠챌린지
- Today
- Total
제주 탈출 일지
오버라이딩(overriding) 본문
오버로드(overload) : 다른 인수를 가지는 함수들을 같은 함수로 정의하는 것.
오버라이딩(overriding) : 이미 정의된 함수를 무시하고 같은 이름의 새로운 함수를 정의하는 것.
오버라이딩은
1. 파생 클래스에서 재정의
2. 가상 함수에서 재정의
두 가지로 나뉜다고 한다.
1. 파생 클래스 재정의
class Person
{
private:
string name_;
int age_;
public:
Person(const string& name, int age); // 기초 클래스 생성자의 선언
void ShowPersonInfo();
};
class Student : public Person
{
private:
int student_id_;
public:
Student(int sid, const string& name, int age); // 파생 클래스 생성자의 선언
void ShowPersonInfo(); // 파생 클래스에서 상속받은 멤버 함수의 재정의
};
student 클래스를 보면 showPersoninfo를 상속받았지만 동일한 이름으로 다시 재정의하는 것을 볼 수 있다.
이렇게 재정의 했지만, Person::ShowPersonInfo라고 기초 클래스와 :: 연산자를 사용한다면 해당 함수도 사용할 수 있다.
예를 들어, 객체 이름이 LHS라고 한다면, LHS.ShowPersonInfo는 오버라이딩 된 함수가 호출되겠지만,
LHS.Person::ShowPersonInfo()를 호출할 경우 기초 클래스의 함수가 호출되게 된다.
2. 가상 함수를 이용한 오버라이딩
위의 파생클래스를 통한 재정의는 포인터 사용시 문제가 발생한다.
Person* person1;
Person* person2;
Person LHS(...);
Student Lee(...);
person = &LHS;
person = &Lee;
라고 할떄, LHS는 동일한 타입이지만, Lee의 경우는 파생 클래스인 Student 로 다른 타입이다.
(상속된 파생 클래스는 부모의 모든 속성을 가지고 있으므로 문제가 되지는 않는 것 같다.)
이 때, ShowPersonInfo를 호출 하면, 모두 부모의 멤버인 ShowPersonInfo가 호출 된다.
왜? 포인터 타입이 Person이므로 Person의 멤버 함수인 ShowPersonInfor가 호출되게 되는 것이다.
이럴 떄를 대비해서 가상 함수를 통한 virtual 키워드를 제공하고 있다.
위에서 단순 void ShowPersonInfo로 Student에서 정의하는 것이 아니라 virtual void ShowPersonInfo로
정의하면 객체에 맞는 함수를 호출할 수 있게 된다.
잘 정리하면 좋을 것 같다.
/* 2020-09-04 추가*/
연산자 오버로딩
operator연산자() 형태로 연산자 오버로딩을 진행한다. Point 클래스를 만들면 내부가 어떻게 생겼는지도 모르는데 무턱대고 연산할 수는 없는 법이니.. 어찌보면 당연하다.
이렇게 오버로딩을 하는 것에는 두가지
1. 멤버 함수를 이용한 연산자 오버로딩
2. 전역 함수를 이용한 연산자 오버로딩
이 존재한다.
1번이 멤버함수로 const Point operator+() 정의하여 사용하는 형태이다.
2번은 멤버함수로 오버로딩을 사용하지 못할 때, 사용한다.
1번의 경우 객체 p1과 p2가 있다면 p1.operator+(p2)와 같은 형태로 호출되지만,
2번의 경우는 operator+(p1, p2)와 같은 형태로 호출된다.
당연히 2번은 객체의 private 멤버에 접근하기 어려우므로 프렌드로 지정하고 사용해야 한다.
(책에서 프렌드 함수가 캡슐화를 저해하므로 getter, setter를 이용하는 것을 권장한다고 한다. 참고)
getX, setX와 같은 것을 말하는것 같다.
'C++' 카테고리의 다른 글
스마트 포인터(smart pointer) (0) | 2020.08.18 |
---|---|
템플릿 (함수, 클래스) (0) | 2020.08.17 |
추상 클래스(abstract class) (0) | 2020.08.17 |
파생 클래스 (0) | 2020.08.13 |
프렌드(friend) (0) | 2020.08.11 |