본문 바로가기
Delphi/Delphi란?

Delphi OOP와 C++과의 차이 [3]

by MonoSoft 2021. 4. 28.
728x90
반응형

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++과 비교해서

설명하겠다.

728x90
반응형

'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

댓글