2011. 3. 9. 19:39

virtual 함수는,
최종적으로 오버라이딩 한 함수를 제외하고 나머지 함수는 가려지게 된다.

static binding : 컴파일하는 동안(컴파일-타임)에 호출될 함수가 결정. (호출될 함수가 이미 고정되어 있는것.)

dynamic binding : 컴파일 하는 동안(컴파일-타임)에 호출될 함수가 결정되는 것이 아니라, 실행하는 동안(런-타임)에 호출될 함수가 결정된다. 포인터가 가리키는 객체가 무엇이냐에 따라서 그 문장이 호출되는 함수는 유동적이다.
다형성의 한 예("모양은 같은데 형태는 다르다.")

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
public:
 virtual void fct()
 {
  cout<<"AAA"<<endl;
 }
};
class BBB : public AAA
{
public:
 void fct()    //virtual 키워드를 삽입하지 않더라도 자동적으로 virtual void fct()화 됨.
 {
  cout<<"BBB"<<endl;
 }
};

class CCC : public BBB
{
public:
 void fct()
 {
  cout<<"CCC"<<endl;
 }

};

int main(void)
{
 BBB b;
 b.fct(); //static binding
 AAA* a = new BBB;
 a->fct(); //dynaminc binding

 delete a;
 return 0;
}




####virtual 함수를 사용하지 않은 예제결과와 비교해 볼것~!

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
public:
 void fct()
 {
  cout<<"AAA"<<endl;
 }
};
class BBB : public AAA
{
public:
 void fct()
 {
  cout<<"BBB"<<endl;
 }
};

class CCC : public BBB
{
public:
 void fct()
 {
  cout<<"CCC"<<endl;
 }

};

int main(void)
{
 BBB b;
 b.fct(); //static binding
 AAA* a = new BBB;
 a->fct(); //dynaminc binding

 delete a;
 return 0;
}





[오버라이딩 된 함수 호출하기]
방법 : 범위 지정 연산자를 이용.
a->AAA::fuct(); 의 방식으로 사용.
Posted by Triany