기반 클래스에서 정의한 멤버 메서드와 같은 이름으로 파생 형식에서 정의하면 어떻게 동작할까요?
파생 클래스에서 기반 클래스에 정의한 이름과 같은 이름으로 메서드를 만들면 기반 클래스에 정의한 메서드를 무효화합니다.
예를 들어 일반 프로그래머가 있고 EH 프로그래머가 있는데 대부분의 행위에 있어 EH 프로그래머는 일반 프로그래머와 같게 일을 한다고 가정합시다. 하지만 일반 프로그래머가 프로그래밍을 할 때 “생각하면서 코딩을 한다.”와 같이 하는데 EH 프로그래머가 프로그래밍을 할 때는 “생각한 것을 문서화 하고 이를 보면서 코딩을 한다.”고 해 볼게요. 이 때 일반 프로그래머의 프로그래밍이라는 메서드를 무효화합니다.
//무효화 #include <string> #include <iostream> using namespace std; class Programmer { public: void Programming() { cout<<"생각하면서 코딩을 한다."<<endl; } }; class EHProgrammer:public Programmer { public: void Programming()//기반 형식의 Programming 메서드를 무효화시킴 { cout<<"생각한 것을 문서화하고 이를 보면서 코딩을 한다."<<endl; } }; int main() { EHProgrammer *ehp = new EHProgrammer(); ehp->Programming(); delete ehp; return 0; }
▷실행 결과
생각한 것을 문서화하고 이를 보면서 코딩을 한다.
특히 무효화는 메서드 이름을 기준으로 하여 기반 클래스에 같은 이름으로 중복 정의한 모든 메서드를 무효화합니다.
만약 일반 프로그래머에 프로그래밍이라는 메서드가 중복되어 있다고 가정해 봅시다. 하나는 매개 변수가 없는 메서드, 다른 하나는 매개 변수로 시간을 주는 메소드 형태일 때 EH 프로그래머에서 프로젝트 명을 입력 인자로 주는 메서드를 만들면 같은 이름을 갖는 일반 프로그래머에 프로그래밍이라는 모든 메서드를 무효화합니다.
//무효화2 #include <string> #include <iostream> using namespace std; class Programmer { public: void Programming() { cout<<"생각하면서 코딩을 한다."<<endl; } void Programming(int tcnt) { cout<<tcnt<<"시간 "; Programming(); } }; class EHProgrammer:public Programmer { public: void Programming(string title)//기반 형식의 Programming 메서드를 무효화시킴 { cout<<"프로젝트명:"<<title<<endl; cout<<"생각한 것을 문서화하고 이를 보면서 코딩을 한다."<<endl; } }; int main() { EHProgrammer *ehp = new EHProgrammer(); //ehp->Programming(); 기반 클래스에 같은 이름의 메서드를 무효화하여 호출할 수 없음 ehp->Programming("도서 관리 프로그램"); delete ehp; return 0; }
▷ 실행 결과
프로젝트명: 도서 관리 프로그램
생각한 것을 문서화하고 이를 보면서 코딩을 한다.
다음은 무효화한 기반 클래스의 메서드를 호출하였을 때 발생하는 오류 화면입니다.
이처럼 무효화한 기반 클래스의 메서드는 파생 클래스에서 기반 클래스 이름과 스코프 연산자(::)까지 포함하면 호출할 수 있습니다.
Programmer::Programming(tcnt); //무효화한 기반 클래스 메서드 호출
다음은 파생 클래스 EHProgrammer에서 무효화한 기반 클래스의 Programming 메서드를 호출하는 예제 코드입니다.
//무효화한 기반 클래스 멤버 사용하기 #include <string> #include <iostream> using namespace std; class Programmer { public: void Programming() { cout<<"생각하면서 코딩을 한다."<<endl; } void Programming(int tcnt) { cout<<tcnt<<"시간 "; Programming(); } }; class EHProgrammer:public Programmer { public: void Programming(string title,int tcnt)//기반 형식의 Programming 메서드를 무효화시킴 { cout<<"프로젝트명:"<<title<<endl; cout<<"생각하고 문서화한다."<<endl; Programmer::Programming(tcnt); //무효화한 기반 클래스 메서드 호출 } }; int main() { EHProgrammer *ehp = new EHProgrammer(); ehp->Programming("도서 관리 프로그램",10); delete ehp; return 0; }
▷ 실행 결과
프로젝트명:도서 관리 프로그램
생각하고 문서화한다.
10시간 생각하면서 코딩을 한다.