C++프로그래밍

2013.11.21 _ 상속에서 멤버 함수 재정의(함수오버로딩,함수오버라이딩)

성엽이 2013. 11. 21. 10:01

함수 오버로딩                                                                                          

: 함수 이름은 같으나 함수의 매개변수는 다르게 정의하는 것


 함수오버로딩 예제

  // 함수 오버로딩


#include <iostream>
using  namespace  std;

class  TwoNumber
{
  public:
    TwoNumber();
    int AddNumber(const int ia, const int ib);
    double AddNumber(const double da, const double db);
  private:
    int i_sum;
    double d_sum;
};

TwoNumber::TwoNumber()
{
  i_sum = 0
  d_sum = 0;
}

int TwoNumber::AddNumber(const int ia, const int ib)
{
  i_sum = ia + ib;
  return i_sum;
}

double TwoNumber::AddNumber(const double da, const double db)
{
  d_sum = da + db;
  return d_sum;
}

int main()
{
  TwoNumber obj1;

  /* 함수 오버로딩 : 함수 인자만 다르고 구별할수 있는 경우*/

  // 정수형 함수가 선택됨 
  cout << "3+4 = " << obj1.AddNumber(3,4<< endl;  

  // 실수형 함수가 선택됨 
  cout << "3.5 + 4.6 = " << obj1.AddNumber(3.54.6<< endl;
  
  return 0;
}

 : 매개변수의 형태에 따라서 호출되는 함수가 달라진다.



함수오버라이딩                                                                                          

: 기반클래스의 멤버함수를 파생클래스에서 다시 정의하는 것


동적결합( Dynamic Binding )

: 프로그램의 실행 or 컴파일시 어떤 함수가 호출될지 결정을하여 적당한 멤버를 참조하는 것 

  이렇게 하나의 함수가 여러가지 구현형태로 정의되는 것을 다형성(Polymorphism) 이라한다.


 함수 오버라이딩 예제

 // 함수 오버라이딩 

#include <iostream>
using  namespace  std;

class  SMARTBASE
{
  public:
    void K()
    {
      cout << "SMARTBASE Class";      
    }
};

class  SMART : public SMARTBASE
{
  public:
    void K()
    {
      cout << "SMART Class";      
    }
};

int main()
{
  SMART obj;

  // 본인의 K 함수가 우선 ( 오버라이딩 )
  obj.K();
  // 스코프 연산자를 사용하면 접근이 둘다 가능하다.
  obj.SMART::K();
  
  return 0;
}
 
 : 기반클래스에 있는 이름과 인자가 동일한 함수가 상속받은 파생클래스에 존재시, 스코프 연산자를 이용해

   두 함수를 구분해서 호출이 가능하다.



 함수 오버라이딩 예제 ( virtual 포함 ) 

  // 함수 오버라이딩 수정 후 소스

#include <iostream>
using  namespace  std;

class  A
{
  public:
     virtual string ClassMessage()  // 가상함수
    {
      return "Class A";
    }
};

class  B : public A
{
  public:
    string ClassMessage()  // 함수 오버라이딩
    {
      return "Class B";  // return 문자열, string 객체 
    }
};

void TestFunction1(A &x)
{  
  // x.ClassMessage() 스트링 객체 
  cout << x.ClassMessage().data() << endl;
}

int main()
{
  A a;
  B b;


  TestFunction1(a);  
  TestFunction1(b);  

  return 0;
}

 : 다른형태로 다형성에 의해 함수를 재정의 하기 위해서는 가상함수(virtual function)를 선언하면 된다.

   기반클래스의 멤버 앞에 virtual 을 추가시킨다.


           결과사진                                                           


: 함수 오버로딩을 통해서 호출한 매개변수의 차이점 과 함수 오버라이딩을 통해서 실행에서 원하는 멤버 함수를 찾아

  호출 되는 것을 확인 할 수 있다.


            실습소스               

131120_Src_12-1.cpp


131120_Src_12-2.cpp


131120_Src_12-3.cpp


131120_Src_12-3.exe