[C++] 오버라이딩과 오버로딩

김세희·2025년 7월 18일

오버라이딩

상속 관계에서 자식 클래스가 부모 클래스의 가상 함수를 재정의 하는 것이다.
상속 관계에서만 발생하며 오버라이딩 시 부모 클래스에 필수적으로 virtual 키워드를 붙여야 한다.

virtual 키워드가 붙어 오버라이딩 된 가상 함수들 중 호출될 메서드는 런타임 중에 동적 바인딩된다. 따라서 부모 클래스에서 가상 함수를 정의할 때 키워드를 붙여야 컴파일러가 동적 바인딩 될 가상 함수인지 알 수 있고 키워드가 없다면 상속관계에서도 정적 바인딩을 사용하여 별개의 함수로 인지한다.

순수 가상 함수
순수 가상 함수는 가상 함수의 뒤에 =0 을 붙여 정의하며 부모 클래스에서는 실제로 구현하지 않는다. 이런 순수 가상 함수를 하나 이상 갖는 클래스를 추상 클래스라고 한다.
추상 클래스는 직접 객체를 생성할 수 없고 상속하는 자식 클래스에서도 구현하지 않으면 객체를 생성할 수 없고 객체 생성을 시도하면 컴파일 오류가 발생해 구현을 강제한다.
추상 클래스의 소스에서 구현을 하는게 막히는 것은 아니다. 하지만 구현을 해도 객체 생성이 안되는것은 마찬가지다. 이렇게 순수 가상 함수를 구현하는 것은 자식 클래스에 기본 동작을 제공하고 싶을 경우나 순수 가상 소멸자를 구현하는 경우이다.

순수 가상 소멸자
이 경우는 반드시 구현을 제공해야 한다. 자식 클래스 객체가 소멸될 때 부모 클래스의 소멸자도 호출하는데 이 때 구현되어 있지 않으면 링커 오류가 발생한다.

오버로딩

동일한 이름의 함수이지만 다른 시그니처를 갖는 함수를 정의한다.
상속과는 관계없는 개념이며 같은 스코프 안에서만 적용된다.
만약 자식 클래스에서 같은 이름에 시그니처가 다른 함수를 정의한다면 컴파일러가 함수를 호출할 때 전달되는 인자의 타입과 개수를 보고 어떤 함수를 호출할 지 결정한다. 컴파일 단계에서 결정되는 정적 다형성이다.
오버로드는 오버라이딩과 달리 키워드를 붙이지 않는다.
시그니처가 맞는 함수가 없다면 컴파일시 에러가 발생한다.

생성자의 오버라이딩과 오버로딩

오버라이딩

불가능. virtual 키워드를 붙이면 컴파일 에러가 발생한다.
오버라이딩은 런타임 다형성을 구현하기 위한 메커니즘이다. 생성자가 호출되는 시점은 객체가 생성되기 전이므로 다형성을 위한 메커니즘이 활성화되지 않은 상태이기 때문에 가상 함수 메커니즘이 적용될 수 없어 오버라이딩이 불가능하다.

오버로딩

가능. 클래스 내에서 다른 시그니처를 갖는 생성자를 여러개 정의할 수 있다.
객체 생성시 전달되는 인자에 따라 맞는 생성자를 호출한다.

소멸자의 오버라이딩과 오버로딩

오버라이딩

가능. 객체가 이미 존재하는 상태에서 호출되므로 다형성의 대상이 될 수 있고 런타임 다형성을 통해 실제 객체 타입을 따라가 자식 클래스의 데이터가 안전하게 해제되도록 보장한다.
부모 클래스 포인터에 자식클래스 객체가 동적할당된 경우 오버라이딩을 하지 않으면 자식 객체에 동적할당된 메모리가 있을 경우 메모리 누수가 발생할 수 있다.

오버로딩

불가능. 소멸자는 매개변수를 가질 수 없고 하나의 형태로만 존재해야하기 때문에 컴파일 에러가 발생한다.

0개의 댓글