C++에서 함수의 상속은 2가지로 말 할수 있다.
가상 함수와 비 가상 함수이다.
비 가상 함수는 파생 클래스에서 재 정의 하면 안되므로... 넘기고 나면, 가상 함수에 해당 하는 내용이란 걸 알수 있습니다.
상속 받은 가상 함수에서 기본 매개 변수의 값을 변경 하면 안되는 이유는, 동적 바인딩과 정적 바인딩을 알아 보면 된다.
가상 함수는 동적 바인딩이고 기본 매개 변수 값은 정적 바인딩 입니다.
가상 함수와 비 가상 함수이다.
비 가상 함수는 파생 클래스에서 재 정의 하면 안되므로... 넘기고 나면, 가상 함수에 해당 하는 내용이란 걸 알수 있습니다.
상속 받은 가상 함수에서 기본 매개 변수의 값을 변경 하면 안되는 이유는, 동적 바인딩과 정적 바인딩을 알아 보면 된다.
가상 함수는 동적 바인딩이고 기본 매개 변수 값은 정적 바인딩 입니다.
// t.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" class CBase { public: virtual void Show(const int _iIndex = 0) { std::cout << "CBase : " << _iIndex << std::endl; } }; class CTest : public CBase { public: void Show(const int _iIndex = 1) { std::cout << "CTest : " << _iIndex << std::endl; } }; class CTest2 : public CBase { public: void Show(const int _iIndex = 2) { std::cout << "CTest2 : " << _iIndex << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { /* t_pBase, t_pTest, t_pTest2는 CBaes에 대한 포인터로 선언 되어 있으므로 정적 타입은 모두 CBase에 대한 포인터임. 가르키는 것에 대한 변화는 없음. 객체의 동적 타입은 현재 그 객체가 가르키는 것에 의해 결정. 즉, t_pTest의 동적 타입은 CTest*고, t_pTest2의 동적 타입은 CTest2* 이다. 동적 타입은 도중에 변경이 가능. ex) t_pTest = t_pTest2 위에서 말 했듯이 가상함수는 동적타입이고 상속 받는 기본 매개변수들은 정적 타입입니다. 즉, 실행 되는 함수 실행 내용은 알맞은 내용을 수행 하지만, 그 가상 함수에 대한 개본 매개변수는 정적 타입에 대한것을 불러서 이상한 결과를 초래 하게 된다. */ CBase* t_pBase; CBase* t_pTest = new CTest; CBase* t_pTest2 = new CTest2; /// CTest::Show(const int _iIndex = 1)을 호출 하지만, 기본 매개변수는 0을 호출. t_pBase = t_pTest; t_pBase->Show(); /// CTest2::Show(const int _iIndex = 2)을 호출 하지만, 기본 매개변수는 0을 호출. t_pBase = t_pTest2; t_pBase->Show(); return 0; } /* /// 비가상 인터페이스(non-virtual interface)관용구(NVI)를 이용한 눈속임? class CBase { public: void Show(const int _iIndex = 0) { doShow(_iIndex); } private: virtual doShow(const int _iIndex) = 0; }; */
'[ Programming ]' 카테고리의 다른 글
사용자 정의 타입변환 함수에 대한 주의를 놓지 말자. (0) | 2009.10.07 |
---|---|
컴파일러의 분석. (4) | 2009.07.31 |
인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하기. (0) | 2009.07.15 |
상속된 이름을 숨기는 일은 피하자. (4) | 2009.07.05 |
파일 사이의 컴파일 의존성을 최대로 줄이자. (3) | 2009.06.23 |