Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[36] 알쏭 달쏭 오브젝트 파스칼 문제 2탄
주정섭 [jjsverylong] 5287 읽음    2004-07-14 15:26
알쏭 달쏭 오브젝트 파스칼 문제 2탄

지난번 문제 출제의 엄청난 결과(?)에 힘 입어 두번째 문제를 출제해 볼까 한다.

지난번 문제는 초반에 엄청난 신공으로 상당수 정답을 맞추는 사람이 등장하여, 문제 출제자의 엄청난 노력을 단숨에 물거품으로 만들어 버리는 바람에, 문제 출제자는 스트레스를 엄청 받았다. 그래서 좀더 노력을 기울여 이 문제들을 만들었는데, 또 누가 등장하여 이 문제 출제자를 당황하게 할지 기대가 크다.

델파이 관련 매뉴얼에서 매우 변두리 지역에서 찾은 문제다. 어렵지 않을 수도 있지만, 만만한 문제들은 아니라고 생각한다.

다음 문제들은 클래스의 상속에 대한 문제들이 주다. 평소 상속에 대해서 잘 알고 있다고 생각하던 나도 문제를 내면서 많은 것을 새로 배웠다. 같이 풀어 보자.

이 문제 소스들을 작성 컴파일 해보지 않고, 오로지 직관으로만 풀었다면, 귀하는 엄청난 오브젝트 파스칼 고수임이 틀림없다. 만일 나에게 이런 문제가 주어졌다면 컴파일 해보지 않고, 푼다는 것은 아마도 힘들 것이다.

[당부의 말씀]

문제를 푼 사람은 자신의 정답을  답변으로 달지 말아 주시길 부탁한다. 이렇게 하면, 다른 사람들의 혼자서 풀어 보려는 노력을 저해할 수 있으므로, 문제를 푼 후 정답을 확인하고 싶으신 분은, www.delphikorea.com에서 자신의 답변을 나에게 쪽지로 날려 주시면 고맙겠다. 나의 개인 이메일 주소를 아시는 분은 메일로 보내도 된다. 여기서 이메일 주소를 공개하면 워낙 많은 잡스런 메일들이 날라와서 이메일 주소를 공개하지는 않겠다.

델파이 코리아 사이트에서 본인의 아이디는 jjsverylong 이다.


------------------문제 시작 -----------------------------------------


먼저 문제를 풀기에 앞서 다음과 같이 정의된 클래스가 있다고 가정하자. 참고로 문제는 콘솔 프라젝트로 생성했다.

[문제 참고 소스] 문제 1, 2, 3 번에서 사용함

다음과 같이 TSuper, TChild 클래스가 정의되어 있고, Method1이 정의되어 있다고 전제 하자.

type
  TSuper = class(TObject)
  public
    procedure Method1; virtual;
  end;

  TChild = class(TSuper)
  public
    procedure Method1; override;
  end;

  procedure TestMain();

implementation

procedure TSuper.Method1;
begin
    WriteLn('Super Method1');
end;

procedure TChild.Method1;
begin
    WriteLn('Child Method1');
end;

[문제1] 위의 문제 참고 소스 처럼 TSuper, TChild 클래스가 정의되어 있다고 가정하고, 다음과 같은 코드를 실행하면 화면에 어떤 내용이 출력 되겠는가?

..실행코드...
procedure TestMain();
var
    obj1, obj2 : TSuper;
begin
    obj1 := TSuper.Create;
    obj2 := TChild.Create;

    obj1.Method1;
    TChild(obj1).Method1;
    obj2.Method1;
    TSuper(obj2).Method1;

    obj1.Free;
    obj2.Free;
end;

[문제2] 만일, 문제 참고 소스의 TChild 클래스 정의부에서, override를 코멘트화 해버리면 문제 1의 화면 출력 결과는 어떻게 되겠는가?

  TChild = class(TSuper)
  public
    procedure Method1; //override; 오버라이드 문을 코멘트화해 버림
  end;
 
[문제3] TChild 클래스의 Method1 선언부에서 override를 코멘트화하면, 실행에러는 아니지만, 다음과 같은 컴파일 경고가 뜬다.

  TChild = class(TSuper)
  public
    procedure Method1; //override; 오버라이드 문을 코멘트화한 이 라인에서 컴파일 경고 발생
  end;

컴파일 경고: Method 'Method1' hides virtual method of base type TSuper

override문을 사용하지 않고도 이 컴파일 경고를 없애려면, TChild 클래스의 procedure Method1 선언부를 어떤 방식으로 수정해야 하는가? (이말인즉 Method1의 버추얼 메커니즘을 무시하겠다는 뜻이다.)

[문제4] 다음과 같은 소스가 있는데 컴파일 에러가 발생했다. 컴파일 에러 원인이 무엇인가?

unit unTest2;

interface

type
  TTest = class(TObject)
  published
    procedure Method1(I: integer); overload;
    procedure Method1(S: String); overload; 
  end;

implementation

{ TTest }

procedure TTest.Method1(I: integer);
begin
end;

procedure TTest.Method1(S: String);
begin
end;

end.

[문제5] 아래의 소스를 컴파일 하려하자, 다음과 같은 컴파일 경고가 발생했다. 이 컴파일 경고를 완전히 없애려면 아래 소스를 어떻게 수정해야 하는가?

컴파일 경고: Method Test hides virtual method of type T1

unit unTest2;

interface

  T1 = class(TObject)
    procedure Test(I: Integer); virtual;
  end;

  T2 = class(T1)
    procedure Test(S: string);
  end;

implementation

{ T1 }

procedure T1.Test(I: Integer);
begin

end;

{ T2 }

procedure T2.Test(S: string);
begin

end;

end.


------------------------------  문제 끝 -----------------------------------------
http://cafe.daum.net/delphinegong
류종택 [ryujt]   2004-07-14 16:20 X
글의 분류가 애매하네요.
딱히 맞는 게시판도 없고해서 저번 글과 달리 이 게시판에 그대로 보존합니다.

+ -

관련 글 리스트
36 알쏭 달쏭 오브젝트 파스칼 문제 2탄 주정섭 5287 2004/07/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.