오버라이딩(Overriding)

2015. 3. 31. 04:03프로그래밍/C/C++

728x90
728x90

1. 서론

아카데미에서 오버라이딩의 개념이 논쟁이 되었다.


" 부모 객체에서 자식 객체에게 virtual 가상 함수가 없이 자식 객체에서 이름이 같은 함수를 정의하는 것이

과연 오버라이딩이라고 봐야 하는가? "


이것에 대한 논쟁이 끊이지 않았는데, 많은 웹이나 블로그에서 저런 경우를 오버라이딩이라고 정의하고 있다.

책들도 거의 애매한 내용으로 정의하는 경우가 많다.

"부모 클래스의 함수를 자식 클래스에서 재정의 하는 것이 오버라이딩"이라고 해놓고

정작 저런 경우엔 오버라이딩이라는 개념에 대해 명확하게 나와있지 않다.

교수님은 'virtual가 사용되지 않은 것은 절~!!!대 오버라이딩이라 할 수 없다.' 라고 말씀하셨다.

그래서 이런 조사 숙제가!!


KTM 8기 동기 성국이가 스트롭스트룹님 용어사전에 원문을 해석한것이 좋은 자료여서 퍼왔다.

출처 : http://blog.naver.com/shunhegel/220315825798



최초 작성일자: 2015-03-30

최종 작성일자: 2015-03-30


비야니 스트로스트룹(Bjarne Stroustrup)은 자신의 저서 The C++ Programming Language, 4th Edition와 Programming Principles and Practice Using C++의 용어사전, 그리고 자신의 홈페이지의 용어사전에서 오버라이드와 오버라이딩에 대해 다음과 같이 정의하고 있다.


1. 파생 클래스에서 기반 클래스의 가상 함수와 같은 이름과 같은 매개변수 타입들의 집합을 가진 함수의 경우, 이 함수가 기반 클래스 버전의 가상 함수를 오버라이드한다고 말한다. (후략)



출처: 비야니 스트로스트룹(Bjarne Stroustrup), The C++ Programming Language, 4th Edition, Addison-Wesley Professional, 2013, p. 587.


2. "오버라이드는 파생 클래스에서 기반 클래스와 같은 이름과 매개변수 타입들을 가상 함수로서 가지고 있는 함수를 정의하며, 이에 따라 기반 클래스에 의해 정의된 인터페이스를 통해 호출 가능한 함수를 만드는 것을 말한다.



출처: 비야니 스트로스트룹(Bjarne Stroustrup), Programming Principles and Practice Using C++, 2nd Edition, Addison-Wesley Professional, 2014에 수록된 용어사전(Glossary)


3. 오버라이딩 - 파생 클래스에서 기반 클래스에 있는 함수와 같은 이름과 타입을 가진 가상 함수를 선언하는 것. 매개변수의 타입은 반드시 일치해야 하며, 반환 타입은 반드시 정확히 일치하거나 공변(共變, co-variant) 관계에 있어야 한다. 오버라이딩 함수은 가상 함수가 호출 될 때 사용된다.



출처: 비야니 스트로스트룹(Bjarne Stroustrup)의 C++ 용어사전 (http://stroustrup.com/glossary.html#Goverriding)


이러한 서술 내용을 볼 때, 비야니 스트로스트룹에게 오버라이딩이란 가상 함수와 분리해서 생각할 수 없는 개념이며, 일부 서적에서 말하는 것처럼 일종의 '재정의(redefinition)'로서 넓게 해석하는 것은 이러한 진술과 상충되는 내용이라고 할 수 있다.


<끝>



ㅇㄹ

ㅁㄴㅇ라ㅓ

ㅇㄹ[출ㅇㄹ

처] [C++] 오버라이딩(Overriding) 대한 Bjarne Stroustrup의 정의|작성자 박성국




2. 창시자가 이렇게 정의하는데?

스트롭 형님이 그렇다면 사실 빼도박도 못하는거 아닌가싶다.

사실 필자는 위의 경우를 오버라이딩이라고 생각하고 있었다.

http://pacs.tistory.com/28

그 계기가 바로 위의 블로그!!!!!!

자식 객체가 인스턴스화 되었을 때, 자식 객체는 부모 객체의 속성을 모두 상속하고 있다.

여기서 부모와 같은 함수를 자식에서 정의하여 사용하고 있는데,

이런 경우 '은닉'의 특성을 가진 오버라이딩이라고 이 블로그에선 이야기 하고 있다.

그래거 필자는 지금까지 이렇게 이해하고 있었다.


하지만 토론을 통해 생각이 바뀐 것은 꽤 괜찮은 의견이 두 가지가 있었다.


첫 번째가 상속 관계이긴 하지만 이 상황은 자식 객체가 이름만 같은 함수를 '정의'했다는 것이다.

'재정의'가 아니라 다른 지역에서 서로 관계없는 '정의'를 했다는 의견.

두 번째가 '재정의'의 개념이 들어가기 위한 가상 함수 테이블이 부재하다는 것이다.

+알파로 위의 용어사전 해석이다.


그러므로 오버라이딩은 virtual가 사용된 가상함수에서 나타나는 특성이라고 할 수 있다.


3. override, sealed, final 키워드

override는 2005년부터 지원하고 있었지만 VS2012까지는 추상함수에 이 키워드를 사용하지 않아도 허용한다.

하지만 VS2013은 C++ 11을 완벽하게 지원한다.

그래서 재정의하는 함수는 VS2013에선 override 키워드를 사용하지 않으면 워닝이 발생한다.

위와 같은 override 개념을 명확하게 해주는 키워드이다.

 

추상 클래스를 더 이상 재정의 하지 않겠다는 키워드도 있다. C++ 11이전엔 sealed 키워드가 있었다.

C++ 11에선 final이라는 키워드가 추가되어 이를 사용할 수 있다.


728x90
반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

비트 연산으로 정수에서 이진수 0,1 뽑아내기  (0) 2015.07.08
[C++] 가상 함수 테이블  (0) 2015.04.01
RTTI , 캐스팅  (0) 2015.03.31
가변인자  (0) 2015.03.31
friend  (0) 2015.03.30
__forceinline, __inline, inline 함수 조사  (0) 2015.03.29
Stroustrup Empty class에 대한 내용 읽어보기  (1) 2015.03.25