[완료]상속에 관한 질문입니다. MFC에서 CDialog와 CWnd의 상속 관계가 이해가 안되서요...
글쓴이: dragona79 / 작성시간: 목, 2007/09/06 - 5:13오후
데브피아에도 질문했지만 확답이 없어서.. 여기에도 올려 봅니다.
중요한건 안궁금하고 항상 이런 문제만 궁금해 하네요...
참고로 툴은 VS2005를 사용하고 있습니다.
CDialog 클래스는 보면 CWnd클래스를 상속 받아 만들어 졌습니다.
CWnd에는 이런 Create함수고 아래와 같이 선언되어있습니다.
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
하지만 CDialog 클래스에서는 VS2005의 인텔리센스에도 위 함수가 나타나지 않고 컴파일의 경우에도
에러가 발생합니다.
테스트는 아래와 같은 코드로 했습니다.
CWnd wnd; wnd.Create(L"aa", L"aa", 0, CRect(0, 0, 0, 0), NULL, 0);
위와 같이 썻을 경우에는 실행엔 문제가 있겠지만 컴파일엔 아무런 문제가 없었습니다.
위 코드를 아래와 같이 CWnd를 CDialog로 바꿨습니다.
CDialog wnd; wnd.Create(L"aa", L"aa", 0, CRect(0, 0, 0, 0), NULL, 0);
1>d:\mylib\sample\testactivex\testactivexctrl.cpp(156) :
error C2661: 'CDialog::Create' : 오버로드된 함수에서 6개의 매개 변수를 사용하지 않습니다.
위와 같은 에러가 발생하였습니다.
제가 아는한 상속 받은 클래스는 부모의 멤버 함수도 사용할수 있는걸로 알고 있는데 그게 적용이 안되는 군요.
MS의 농간일까요?
Forums:
^^
CDialog wnd;
static_cast( &wnd )->Create(L"aa", L"aa", 0, CRect(0, 0, 0, 0), NULL, 0);
이렇게 해보시기 바랍니다.
그럼
CDialog
CDialog wnd;
wnd.CWnd::Create( L"aa", L"aa", 0, CRect(0, 0, 0, 0), NULL, 0);
로 해야 됩니다.
90년대 초중반에 scope 지정 없이 호출되는 컴파일러가 있었던 것으로 기억되는데, 후에 표준이 정립되면서 바뀐게 아닌가 합니다. ( C++ 최근 표준을 확인해보지는 못했네요. )
현재 gcc 도 마찬가지로 scope 지정 없이는 호출 안됩니다.
Orion Project : http://orionids.org
이펙티브C++에는 이런
이펙티브C++에는 이런 실수를 막기위해서라도 자식클래스에서 부모클래스와 같은 이름의 함수를 오버로드하지 않는게 좋다고 나와있더군요...
해결법은 윗분이 말씀하신대로 CWnd::를 붙여서 CWnd의 Create를 호출한다는 것을 명확히 하면 됩니다...만, CWnd의 Create는 CDialog를 만드는데 필요한 내용이 들어있지 않을수가 있으므로 제대로 안돌아갈수도 있을것 같습니다.
댓글 달기