각 클래스별로 상속관계를 알아봤으니 이제 함수 오버라이딩과 오버로딩에 대해서 알아보고 Virtual 함수의
사용처에 대해서도 알아보도록 하겠습니다.
먼저 용어부터 확인해보도록 하겠습니다.
오버로딩 - 매게 변수의 자료형이나 매게 변수 갯수가 다른 같은 함수 이름으로 여러번 정의하는것
오러다이딩 - 이미 있는 함수를 새롭게 재정의 하는 것.
(클래스 상속간에 기초 클래스에 정의된 함수를 같은 이름으로 유도 클래스에서 재정의 하는 것)
처음에 클래스간의 함수 이름이 다를 경우 이를 딱히 고민하지 않아도 되지만, Render 나 init , release 같은 함수가 공용되게 사용되거나 같은 함수명을 사용하는 경우라면 필요하게 됩니다.
그럼 먼저 코드를 확인해보겠습니다.
1. 상속 오버라이딩
outText라는 함수가 A와 B 클래스 모두있고 이때 A클래스를 상속받은 B 클래스가 있다면, 여기서 실행되는 outText는 B클래스의 함수로 실행이 됩니다.
상속이 되었더라도 동일한 함수명이라면 당연히 기초 클래스의 함수는 가려지게 되고 유도 클래스의 함수가 실행되게 됩니다.
그렇다면 기초 클래스인 A의 함수를 실행시키려면 어떻게 해야 할까요?
위에 처럼 범위 지정 연산자를 사용해도 되고...
애초에 함수이름이 다르면 됩니다..(물론 그럴 경우가 아닌 경우를 위해서...)
2. Virtual 함수
virtual 함수는 하나의 함수가 여러 의미를 가지고 사용되도록 다형성을 위해서 사용됩니다.
만약 네모와 세모와 동그라미의 도형을 그리는 프로그램이 필요하다면, 도형들에는 폭 , 높이, 반지름 , 중심점 등의 공통된 특성들이 있어 해당 부분만 기초 클래스에서 파생후에 상속한다면, 그 특성을 사용할 수 있습니다.
다만, 각기 다른 그리기 함수 (이하 Render라고 하겠습니다.)가 필요하게 됩니다.(그리는 방법이 다르기 때문에)
이때 범위 지정 연산자와 같은 것들을 사용하거나 각기 다른 이름으로 함수를 정의하게 된다면, 추후에 추가될때마다 함수의 이름과 더불어 코드의 복잡성이 증가하게 됩니다.
기존과 같은 방식으로 B라는 클래스의 함수를 실행하려고 코드를 작성합니다.
pa라는 A 클래스 포인터를 b를 참조하였지만 A 클래스의 함수만 실행되어 버립니다.
이는 처음 선언한 A 클래스의 포인터가 포인터의 자료형(클래스)를 기준으로 판단하기 때문입니다.
그럼 A 클래스와 B 클래스의 함수가 각기 실행되게 하려면 어떻게 해야 할까요?
이럴떄 virtual 함수를 사용하면 됩니다.
상속하는 기초 클래스에서 virtual 함수를 선언하고 이것을 상속받게 되면 됩니다.
(기초 클래스에서 virtual 함수로 선언하면 상속되는 유도 클래스에서는 자동으로 virtual 함수(오버라이딩)로 인식됩니다. 다만, 가독성을 위해서 상속받은 유도 클래스인 B 클래스도 가시적으로 virtual을 사용합니다.)
virtual 함수를 사용하면 내가 참조(가리키는)하는 객체의 함수를 실행할 수 있습니다.
'프로그래밍 > C++' 카테고리의 다른 글
[ C++]연산자 오버로딩(1) - operator 키워드 (0) | 2015.10.20 |
---|---|
[ C++]클래스 상속(4) - 순수 가상 함수 & 다중 상속 (0) | 2015.09.29 |
[ C++]클래스 상속(2) - 상속 객체와 포인터(객체 포인터) (0) | 2015.09.25 |
[ C++]클래스 상속(1) - 상속을 위한 조건 (0) | 2015.09.24 |
[C++] 구조체 (직접참조와 간접참조) (0) | 2015.09.11 |