본문 바로가기

Language/C++ 그때그때 끄적끄적

[C++] Virtual가상함수와 Overidding오버라이딩

오버로딩과 오버라이딩은 객체 지향 프로그램에서 서로다른 객체들에게 같은 기능에대해 같은 의미를 갖는 특징을 객체의 다형성이라고합니다

우리는 오버로딩으로 매개변수의 타입의 다형성을 오버라이딩을통해 클래스간의 다형성을 볼 수 있습니다.

void Calcu(int a,int b)				//초기 함수
{
	cout << a+b;
}

void Calcu(float a,float b)			// 오버로딩
{
	cout << a+b;
}

void Calcu(int a,int b)				// 오버라이딩
{
	cout << a-b;
}

가상함수(Virtual)는 오버라이딩을 할 함수에 사용되어지는 키워드인데요 우리는 가상함수와 오버라이딩을 통해 파생된클래스에서 파생된클래스만의 기능들을 오버라이딩을 통해 재정의 할 수 있었습니다 그렇지만 굳이 가상함수를사용하지않더라도 상속관계에서는 자동적으로 오버라이딩이 지원이됩니다

하지만 여기서 바인딩이라는 문제가 발생합니다.

바인딩은  프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위를 의미하며, 함수의 호출과 호출되는 함수의 실제 메모리 영역의 연결을 바인딩이라고 합니다

결론부터 말씀드리면 Virtual키워드를 사용하지않고 오버라이딩을 한 함수는 정적 바인딩(Static Binding)이되고

Virtual키워드를 사용하여 오버라이딩을 한 함수는 동적 바인딩(Dynamic Binding)이 됩니다.

이둘의 차이는 아래의 코드를 보면 조금 이해하기 쉬울것입니다

#include<iostream>
using namespace std;

class Base{
public :
   virtual void DynamicBinding();
   void StaticBinding();
};

void Base::DynamicBinding() 
{
    cout << "기본 동적 바인딩" << endl;
}

void Base::StaticBinding() 
{
    cout << "기본 정적 바인딩"<< endl;
}

class Derived : public Base{
public :
   virtual void DynamicBinding();
   void StaticBinding();
};

void Derived::DynamicBinding() 
{
    cout << "파생 동적 바인딩" << endl;
}

void Derived::StaticBinding() 
{
    cout << "파생 정적 바인딩"<< endl;
}

int main()
{
   Base *a = new Base();
   Base *b = new Derived();

   a->DynamicBinding();
   a->StaticBinding();

   b->DynamicBinding();
   b->StaticBinding();

   delete a;
   delete b;
}


// 실행 결과
// 기본 동적 바인딩
// 기본 정적 바인딩
// 파생 동적 바인딩
// 기본 정적 바인딩

실행 결과를 보게되면 Virtual 키워드를 사용한DynamicBidning함수는 오버라이딩이 원활하게 이루어진 모습니다 하지만 Virtual 키워드를 사용하지않은 StaticBinding의경우 정적바인딩이 이루어져 우리가 만들려고했던 기능과는 다른실행결과를 볼 수 있습니다 이때문에 Virtual 키워드를 사용하여 오버라이딩을하는 이유에 대해서 알아보았습니다

'Language > C++ 그때그때 끄적끄적' 카테고리의 다른 글

[C++]람다식이란  (0) 2022.05.11
[C++]Struct 와 Class  (0) 2022.01.18
[C++]typedef  (0) 2022.01.11
[C++]키워드(Keyward) 식별자 그리고 예약어  (0) 2022.01.10
[C++]inline 함수와 매크로 함수  (0) 2021.11.12