티스토리 뷰

가상 함수

#test01

#include "stdafx.h" class Parent { public: void Call() { printf("System!! executed Parent::Call!!\n"); } }; class Child : public Parent { public: void Call() { printf("System!! executed Child::Call!!\n"); } }; int main() { Parent P, *pP; Child C; pP = &P; pP->Call(); // parent pP = &C; pP->Call(); // parent }

Parent 클래스 P와, Child클래스 C를 선언하였음.
포인터 접근으로 Parent에서 Call 메소드를 실행하면 당연히 Parent::Call 이 호출됨.
다만 Parent 포인터형을 이용해 Child 형의 클래스의 Call 을 호출하니, Parent::Call 이 호출됨. (?? 왜 Child클래스가 Parent 포인터에 들어가는지 잘 모르겠음.
C++ 컴파일러 포인터로 객체(클래스)의 멤버에 접근할 경우,
실제로 가리키는 객체의 자료형을 기준으로 하는게 아닌, 포인터의 자료형을 기준으로 판단하기 때문이다.

실제로 가리키는 객체의 자료형에 따라 멤버 함수가 호출되도록 하려면, virtual 키워드를 메소드 선언문에 추가하면 된다.


#test02
#include "stdafx.h"

class Parent
{
public:
	virtual void Call()
	{
		printf("System!! executed Parent::Call!!\n");
	}
};

class Child : public Parent
{
public:
	virtual void Call()
	{
		printf("System!! executed Child::Call!!\n");
	}

};

int main()
{
	Parent P, *pP;
	Child C, *pC;

	pP = &P;
	pP->Call(); // parent
	pP = &C;
	pP->Call(); // Child
}
각각의 메소드에 "virtual" 키워드를 추가한 결과, 예상한 결과대로 Child 클래스에서는 Child의 메소드가 실행된다.
즉, 가상 함수(virtual)로 메소드를 선언해 줄 경우, 실제로 가리키는 객체에 따라 실행되는 메소드가 결정된다.


순수 가상 함수 (추상 클래스)
#include "stdafx.h"

class Parent
{
public:
	virtual void Call() = 0;
	virtual void Test()
	{
		printf("This is Parent::Test()\n");
	}
};

class Child : public Parent
{
public:
	virtual void Call()
	{
		printf("System!! executed Child::Call!!\n");
	}

};

int main()
{
	Child C;
	C.Test();
	C.Call();
}

순수 가상 함수란?

일반적인 클래스의 함수는 실제로 가리키는 객체에 따라 실행 코드가 달라지고, 재정의 할 수 있는 함수인 반면에, 

순수 가상 함수(추상 클래스)는 함수의 선언만 있고 정의는 없는 함수이다. (클래스의 껍데기라고 볼 수 있으며, 추상 클래스로 불리기도 한다.)

** Java에서 "abstract"와 같은 역할을 한다.


virtual RET_TYPE FUNCTION_NAME() = 0; 과 같이 선언할 수 있다.

순수 가상 함수로(추상화 클래스로) 선언된 클래스는 그 자체로는 인스턴스를 만들 수 없고, 자식 클래스에서 상속함으로써 사용할 수 있게 된다.

또한 순수 가상 함수를 반드시 자식 클래스에서 재정의(override)해 주어야 한다.

'Programing > C++' 카테고리의 다른 글

C++ new, delete / 스택과 힙  (0) 2016.08.08
C++ 연산자 오버로딩  (0) 2016.08.08
C++ 클래스와 구조체의 차이  (0) 2016.08.06
C++ 클래스 _ 상속, 오버라이딩  (0) 2016.08.05
C++ 클래스 _ 기초  (0) 2016.08.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함