Programming/C C++
 오버라이딩(Overriding)

기반클래스의 멤버함수를 파생클래스에서 재정의하는 것을 의미합니다.
class Base
{
public:
   virtual int cals(int a, int b);
};

int Base::cals(int a, int b)
{
   return a + b;
}
Base 클래스에서 cals함수를 정의하고 파라메터로 받은 a, b두개의 정수값을 더하여 그 결과를 반환하도록 하였습니다. 이때 clas함수는 virtual 키워드를 사용하여 선언하였는데 이는 파생클래스에서 해당 함수의 기능을 다시 정의할 수 있도록 허용하기 위함입니다.
class Deri:public Base
{
public:
   int cals(int a, int b);
};

int Deri::cals(int a, int b)
{
   return a - b;
}
Base 클래스를 상속받은 Deri 클래스는 Base에서 정의된 cals를 함수이름과 파라메터 형식을 일치시켜 a와 b두개의 값을 서로 감산하도록 새로 정의하였습니다.
Base b;
int rb = b.cals(10, 20);

Deri d;
int rd = d.cals(200, 100);

cout << rb << endl;
cout << rd << endl;

기반 클래스에서 함수를 정의할때 너무 많은 함수를 virtual 키워드로 선언하지 않도록 주의해야 합니다. 가상함수는 가상함수테이블이라는 저장공간에 가상함수목록을 만들어 넣어두고 프로그램 실행중 가상함수가 호출될때 가상함수테이블에서 현재 실행해야될 함수를 찾아 실행하게 됩니다.

당연히 가상함수테이블을 기억할 저장공간이 따로 필요하게 되고 가상함수테이블에서 원하는 함수를 찾는 작업도 선행되어야 합니다. 따라서 일반 함수를 실행할때 보다 성능적인 차이가 발생할 수 밖에 없습니다.

 다형클래스

가상함수를 가지고 있는 클래스를 다형클래스라고 하는데 이 다형클래스의 함수포인터를 이용해 경우에 따라 다른 동작할 하는 파생클래스의 객체를 가리켜 원하는 멤버함수를 호출할 수 있도록 합니다.

다형 클래스의 특징을 알아보기 위해 위 예제에서의 Base클래스와 이를 상속하는 Deri 클래스에 더하여 * 처리를 하는 다른 Deri클래스를 하나더 생성해 보겠습니다.
class Deri2:public Base
{
public:
   int cals(int a, int b);
};

int Deri2::cals(int a, int b)
{
   return a * b;
}

함수 오버라이딩의 예제에서는 Base b;와 Deri d;처럼 각각의 클래스에 해당하는 객체를 생성하였지만 사실 그렇게 할 필요가 없이 Base 객체의 포인터를 통해 힙에 할당된 파생클래스의 주소를 가리켜 해당 멤버함수를 호출하도록 하면 같은 결과를 얻을 수 있습니다.

Base* b;

b = new Deri();
int r = b->cals(10, 20);
cout << r << endl;

b = new Deri2();
r = b->cals(15, 25);
cout << r << endl;

오버라이딩부분에서 가상함수테이블에 대하여 설명을 드렸는데 이런 것처럼 컴파일 단계에서가 아닌 프로그램 실행중 함수가 호출될때 함수호출부분과 실행부분의 바인딩(연결)이 이루어 지는 것을 후기바인딩이라고 합니다.

다형클래스의 활용도 이 후기바인딩을 이용하는 것입니다.
0 0