[Basic] 클래스 상속 및 가상함수, 순수가상함수 정리

Program Lang./C++ 2017. 4. 26. 16:13

1. 목적

클래스 상속의 기본 동작, virtual을 써야하는 이유, 순수 가상함수는 무엇인지 정리


2. 클래스 상속 기본

상속은 부모클래스의 생성자, 소멸자, 대입연산자, 정적속성, friend 속성을 제외한 모든 맴버변수 및 함수는 자식 클래스로 복사된다. 만약 부모와 동일이름의 맴버변수가 있으면 자식 클래스의 맴버변수가 우선순위를 가지고 부모 맴버변수는 자식 맴버변수에 가려진다. 동일 이름의 맴버변수는 자식 클래스의 맴버함수로 Overriding된다. 따라서 동일 이름이 존재하면 자식 것은 없애고 부모 것을 사용하던지, 추가 기능이나 변경이 필요하면 자식 클래스에 동일이름에 대해서 다시 구현하면 자동적으로 Overriding이 된다. 아래 예제의 color와 draw()가 이에 해당되는 변수와 함수이다.


강제타입 변환을 제외하고 부모 클래스는 자식을 가르킬 수 있으나, 그 역은 금지되어 있다. 주석처리된 부분이 풀리면 이와 같은 사유로 빌드 에러가 발생한다.



In CLine : draw
In CGraphic : draw
In CGraphic : draw


3. virtual 정의

객체를 동적할당하여 포인터 변수로 받을 때에 포인터 변수가 가르키는 객체를 어떤 기준으로 가져 올 것인가가 virtual의 사용의 출발점이다. 위의 예제에서 draw()함수는 virtual이 아니다. 따라서 CGraphic *pGraphic의 현재 포인터 변수 타입을 기준으로 객체를 가져온다. 따라서 자식 객체를 받더라도 실제 draw()의 실행은 부모 객체의 것이 실행된다. 이를 뒷 단의 할당되는 객체의 타입에 해당하는 draw()을 가져오고 싶으면 virtual로 draw()함수를 선언해야 한다. 아래 코드는 virtual로 변경한 예제와 실행 결과이다.



In CLine : draw

4. 순수 가상함수

상속 받은 자식 클래스에서 완벽하게 구현을 해야 하는 함수에 해당하는 것으로 순수 가상함수 존재하는 클래스는 객체를 생성할 수 없다. 단지 객체를 가르킬 수 있는 포인터 변수는 선언할 수 있다.



5. 정리

부모클래스의 모든 맴버변수 및 함수는 자식 클래스로 복사되고 동일 이름이 존재하면 맴버함수는 Overriding된다. 즉 그대로 사용하거나 재정의해서 사용하면 된다. virtual은 실제 포인터 변수에 할당되는 변수의 타입에 해당되는 객체의 타입을 가르키고자 할 때 사용한다. SoEn에 정리된 내용을 빌리자면 자식클래스에서 변경하거나 포인터 변수로 사용될 가능성이 있는 맴버함수는 virtual로 선언한다. 순수가상함수는 모든 구현을 자식클래스에 양도하는 것으로 부모클래스에는 Interface만 제공한다. 이를 추상클래스라고 한다. 


: