C++ - [가상함수] (feat. Class)

실버타운·2023년 7월 18일

C++

목록 보기
10/10

가상함수

  • 모든 자식 class에서 사용될 기본적인 틀이 되는 함수는 부모 class에서 가상함수로 만들어 부모 class 포인터 타입에서 사용할 수 있다.
    • 이 때, 부모 class의 가상함수를 순수가상함수로 만들어 자식 class에서 이 함수를 구현하지 않으면 안되도록 하여 개발 도중 일어날 수 있는 실수를 방지 할 수 있다.
  • 자식 class에서의 가상함수에는 virtual 키워드를 적지 않아도 상관없지만, 부모 class에서 overriding 된 가상함수임을 명시해 주는 것이 좋다.

Overloding vs Orverriding

중요함으로 짚고 넘어가자.

1. Overloding

  • 함수의 이름이 같고, 인자의 타입 혹은 개수가 다른 함수.
class Test
{
public:
    int Add(int _a, int _b) {return _a + _b;};
    float Add(float _a, float _b) {return _a + _b;};
    double Add(double _a, double _b) {return _a + _b;};
};

위의 예시와 같이 동일한 기능을 수행하는 함수를 다양한 버전으로 만들 수 있다.

Overloding 장점

  • 같은 기능을 하는 함수를 하나의 이름으로 사용할 수 있다.
  • 함수의 이름을 절약할 수 있다.

2. Overriding

  • 부모 class 의 함수를 자식 class 에서 재정의 하는 것으로, Overriding 하고자 하는 함수의 이름, 인자, Return 값이 모두 같아야 한다.
 class TestParent
{
public:
	int aP = 100;
	int bP = 0;

public:
    virtual int Init(int _a, int _b) {return _a = aP, _b = bP};
};

class TestChild :
	public TestParent
{
public:
	int aC = 200;
    int bC = 10;
   
public:
	virtual int Init(int _a, int_b) {return _a = aC, _b = bC;}
}        

위의 예시와 같이 동일한 이름, 인자, Return 값을 가졌지만 결과는 class 마다 다른 함수를 만들 수 있다.

Overriding 특징

    1. 자식 class 에서 Overriding 하는 함수의 접근 제어자를 더 축소 시킬 수 있다.
      • 부모 class 격 포인터 타입에서만 접근이 가능하다.

접근 제어자를 축소 시킴으로 개발 도중 발생할 수 있는 실수가 줄어든다.

    1. 예외(Exception)는 부모 class 의 함수 보다 많이 선언할 수 없다.
      • 전반적인 관리는 부모 class 에서 진행한다.

예외 처리와 같이 상속받은 모든 class 에서 수행되어야 하는 기능은 부모 class에서 관리한다.

    1. static 함수를 인스턴스의 함수로 또는 그 반대로 바꿀 수 없다.
      • 부모 class의 static 함수를 자식 class 에서 같은 이름으로 정의할 수 있지만,
        이것은 재정의 하는 것이 아닌 같은 이름의 static 함수를 새로 선언하는 것이다.

정적 멤버 함수의 경우 자식 class 에서 virtual로 받아 갈 수 없다. 즉, Overriding 할 수 없다.

profile
개발 공부 일지

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기