객체 포인터와 큰 차이는 없다.
객체 포인터 처럼 ClassA의 레퍼런스는 ClassA 객체뿐만 아니라 ClassA 클래스를 상속하는 하위 클래스 객체도 참조가 가능하다.
라고 보면 된다.
말이 어렵지만 소스를 보면 크게 어렵지 않다.
#include <iostream>
class A
{
public:
void showData(){ std::cout << "calss A showData()" << std::endl;}
virtual void showVirtualData(){ std::cout << "class AshowVirtualData()" << std::endl;}
};
class B : public A
{
public:
void showData(){ std::cout << "class B showData()" << std::endl; }
virtual void showVirtualData(){ std::cout << "class B showVirtualData()" << std::endl;}
};
class C : public B
{
public:
void showData(){ std::cout << "class C showData()" << std::endl; }
virtual void showVirtualData(){ std::cout << "class C showVirtualData()" << std::endl;}
};
void main()
{
// class C 객체의 cc라는 인스턴스 생성,
C cc;
// class B 객체 레퍼런스에 cc를 넣어 주고 있다.
B& rb = cc;
// Class A 객체 레퍼런스에 cc를 넣어 주고 있다.
A& ra = cc;
// 자신이 가르킬 수 있는 레퍼런스 만큼만 가르키게 된다.
cc.showData();
rb.showData();
ra.showData();
// virtual을 사용하면 최 하위 클래스의 함수를 사용 가능.
cc.showVirtualData();
rb.showVirtualData();
ra.showVirtualData();
// 결과
// class C showData()
// class B showData()
// class A showData()
// class C showVirtualData()
// class C showVirtualData()
// class C showVirtualData()
}
객체 포인터가 최상위 객체 포인터를 통해 하위를 받는다면,
이번엔 최 하위 객체 레퍼런스를 통해 상위 클래스에 오버라이딩 전 함수를 사용하기 위함으로 쓰면 좋지 않을까?
하는 생각을 조심스레 해본다.
'프로그래밍 > C++' 카테고리의 다른 글
virtual(가상) (0) | 2010.04.03 |
---|---|
함수 오버라이딩(overriding) (0) | 2010.04.03 |
객체 포인터 (2) | 2010.03.29 |
IS-A, HAS-A 관계 (1) | 2010.03.27 |
상속의 형태 (0) | 2010.03.26 |