프로그래밍/cpp

가상함수 virtual 키워드 C++

콘파냐 2013. 6. 4. 20:49

클래스 타입의 포인터로 멤버함수를 호출할 때 virtual 키워드의 유무에따라 동작이 달라지게된다.

예를들면

class A {

public:

void test(){코드1}

};

 

class B : public A{

public:

void test(){코드2}

};

 

A *a = new B();

 

a->test(); //동작1 : 코드1이 실행

 

동작2 : A클래스의 멤버함수인 test()를 virtual로 선언하면 코드2가 실행

 

좀더 확실하게 살펴보자

다음과 같이 코드를 작성해보자.

A클래스와 A를 상속한 B클래스를 선언한 뒤

Message함수를 만들어 A클래스타입의 포인터 pa를 인수로 하여 A객체와 B객체를 정적/동적바인딩을 해보자.

 

정적바인딩

 

동적바인딩(vitual 키워드 사용)

 

vitual 키워드의 유무에따른 두가지 실행결과이다.

클래스타입포인터가 가르키는 대상체에따라(동적바인딩)

클래스타입포인터에따라(정적바인딩)

위경우 클래스타입포인터는 pa(인수)이고 대상체는 a,b이다.

 

느낌이 온다면 먼저 포스팅한 oop에대한 글과 관련지어 일반화를 시켜보자.

2013/05/09 - [프로그래밍/c++] - 클래스 객체와 포인터 그리고 다형성 C++

 

부모는 자식을 가리킬 수 있다.

그렇게 어렵지않다. vitual 키워드를 상속관계에 있는 클래스내부에서 스위치라고 생각하면, 스위치on 인경우 동적바인딩, 스위치가 off인경우 정적바인딩을 한다 생각하면 될 것이다.

 

참고:위 일반화는 다중상속인경우는 제외하도록한다.(이유는 추후에)

반응형