클래스 타입의 포인터로 멤버함수를 호출할 때 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인경우 정적바인딩을 한다 생각하면 될 것이다.
참고:위 일반화는 다중상속인경우는 제외하도록한다.(이유는 추후에)
반응형