Delphi OOP와 C++과의 차이 [3]
Virtual Method
==============
버추얼함수는 선조의 메소드를 후손에서 오버라이딩해서 사용하게 할 수있
도록해주는 C++이 갖는 가장 큰 장점인 Polymorphic Behavior 메카니즘을
제공해준다. 델파이는 C++과 마찬가지로 호출될 함수의 포인
터를 갖는 VMT(Virtual Method Table)을 생성한다. 그러나 델파이는 추가
적으로 런타임시에 힙으로부터 VMT를 생성해주는 Dynamic Virtual Method
를 제공한다. VMT가 런타임시에 동적으로 생성되는것만 다르고, C++의 버
추얼함수하고는 같은 기능을 갖는다. 이 기능은 실행화일상에 VMT 테이블
이 생성되는것을 피해서 화일 사이즈를 작게 만들도록해준다. C++에서...
class Base
{
public:
virtual void VirtualMethod();
void NormalMethod();
};
class Derived : public Base
{
public:
virtual void VirtualMethod();
void NormalMethod();
};
void foo()
{
Derived * derivedobject = new Derived;
// call Derived::VirtualMethod
((Base *)derivedobject)->VirtualMethod();
// call Base::NormalMethod
((Base *)derivedobject)->NormalMethod();
delete derivedobject;
};
델파이에서는..
type
TBase = class(TObject)
public
procedure VirtualMethod; virtual;
// procedure VirtualMethod; dynamic; 도 가능하다.
// dynamic 키워드를 사용하면 런타임시에 VMT 테이블이
// 힙으로부터 생성된다.
procedure NomalMethod;
end;
type
TDerived = class(TBase)
public
procedure VirtualMethod; override;
procedure NormalMethod;
end;
procedure foo;
var
derivedobject: TDerived; // 델파이에서 크래스 객체는 항상
// 레퍼런스타입이다.
begin
derivedobject := TDerived.Create;
// call TDerived.VirtualMethod
TBase(derivedobject).VirtualMethod;
// call TBase.NormalMethod
TBase(derivedobject).NormalMethod;
derivedobject.Destroy;
end;
이런식으로 델파이에서는 C++과 등가인 버추얼함수의 오버라이딩이 구현된
다. 여기에서 C++과는 달리 후손에서 선조의 버추얼함수가 override 키워
드로 정의된것에 주의해야한다. 만약 아래와 같이 C++에서 했던대로 후손
에서 override 키워드 대신, virtual 키워드를 사용하면 C++에서 의도했던
것과 다른 결과를 초래한다.
type
TDerived2 = class(TBase)
public
// 후손에서 override 키워드를 사용하지않고 virtual 키워드를
// 재차 사용했을때는 의도하지않은 결과가 초래된다.
procedure VirtualMethod; virtual;
end;
procedure foo;
var
derivedobject2: TDerived2;
begin
derivedobject2 := TDerived2.Create;
// call TBase.VirtualMethod
TBase(derivedobject2).VirtualMethod;
derivedobject2.Destroy;
end;
델파이에서 후손 크래스가 override 키워드 대신 virtual 키워드를 사용
하면 TBase와는 다른 virtual chain이 시작하는 결과가되기때문에 C++에서
익숙해졌던 습관이 델파이에서는 의도하지않은 결과를 초래할 수 있으므로
주의해야한다.
다음 강좌에서는 델파이 OOP에서의 Exception handling을 C++과 비교해서
설명하겠다.
'Delphi > Delphi란?' 카테고리의 다른 글
델파이 객체지향이란? (0) | 2023.05.31 |
---|---|
Delphi OOP와 C++과의 차이 [5] (0) | 2021.04.30 |
Delphi OOP와 C++과의 차이 [1] (0) | 2021.04.27 |
Delphi란...{6} (0) | 2021.04.26 |
Delphi란...{4} (0) | 2021.04.26 |
댓글