[완료]상속에 관한 질문입니다. MFC에서 CDialog와 CWnd의 상속 관계가 이해가 안되서요...

dragona79의 이미지

데브피아에도 질문했지만 확답이 없어서.. 여기에도 올려 봅니다.

중요한건 안궁금하고 항상 이런 문제만 궁금해 하네요...

참고로 툴은 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의 농간일까요?

익명 사용자의 이미지

CDialog wnd;

static_cast( &wnd )->Create(L"aa", L"aa", 0, CRect(0, 0, 0, 0), NULL, 0);

이렇게 해보시기 바랍니다.

그럼

체스맨의 이미지

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

klara의 이미지

이펙티브C++에는 이런 실수를 막기위해서라도 자식클래스에서 부모클래스와 같은 이름의 함수를 오버로드하지 않는게 좋다고 나와있더군요...

해결법은 윗분이 말씀하신대로 CWnd::를 붙여서 CWnd의 Create를 호출한다는 것을 명확히 하면 됩니다...만, CWnd의 Create는 CDialog를 만드는데 필요한 내용이 들어있지 않을수가 있으므로 제대로 안돌아갈수도 있을것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.