오버로딩과 오버라이딩은 객체 지향 프로그램에서 서로다른 객체들에게 같은 기능에대해 같은 의미를 갖는 특징을 객체의 다형성이라고합니다
우리는 오버로딩으로 매개변수의 타입의 다형성을 오버라이딩을통해 클래스간의 다형성을 볼 수 있습니다.
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 |