1998.6.6 조경민

  C++과 객체 지향
  -------------------------------------


  C++과 객체 지향의 관계


[]. 순수 가상 함수의 용도

     베이스 클래스에다가 파생된 클래스의 함수의 본체를 virtual
  로 지니고 싶을때.

  class base {
    :
    virtual print() = 0;
    :
  };

  순수 가상함수는 함수의 형태가 아니기 때문에

  base bb;
  로 객체를 만들어도 함수는 구현되지 않는다.

  디스트럭처를 순수 가상함수로 구현해도 컴파일은 되지만 링크시
  디스트럭터 함수가 정의 되지 않았다고 에러가 난다.

[]. 추상 클래스

   //순수 가상 함수의 모임으로 클래스 본체를 나타내는 클래스
   class a : virtual public b

   이렇게 함으로써 클래스 a는 클래스 b를 공용 상속받되
   virtual즉 늦은 바인딩(연결)을 하게 된다. ( lately dynamic binding)
   즉 클래스 상속되는 연결이 나중에 일어나게되는것이다.
   즉.

   class base;

   class a : public base;  // 선언과 동시에 상속 연결이 일어난다.
                           // early dynamic binding
   class b : public base;  // 선언과 동시에 상속 연결이 일어난다.

   class c : public a, public b;

       ,- a --- base
    c -
       `- b --- base

    < 사례 1 : 그냥 쓸경우 >
   => 만일 base::print를 c가 불를 경우
      a의 base::print를 부르는지
      b의 base::print를 부르는지
      불분명해져서 에러가 난다. ( base 객체는 현재 두개가 된다.)


   class base;

   class a : virtual public base;  // 나중에 연결이 결정된다.
                                   // lately dynamic binding
   class b : virtual public base;

   class c : public a, public b;

       ,- a -
    c -      `- base
       `- b -'

    < 사례 2 : virtual class inheritance >
   => base::print를 c가 불러도 오류가 없다.
      단지 a::print가 재정의 되었을경우
      c::print호출시 a가 더 가깝기때문에(세분화되었기때문에)
      a::print가 호출된다. 역시
      a::print가 존재하고 b::print가 존재한다면
      c에서 print를 호출할경우 두가지가 레벨이 같기때문에
      에러가 난다.


[]. 클래스 복사

   class a,b;

   a = b

   클래스 복사시 맴버 함수는 포인터가 아니기에 복사가 안되고 멤버
   데이타만 되지만 맴버 함수가 가상함수인경우 이 함수는 포인터
   이기에 복사가 된다.

[]. inline 의 용도

   inline은 일반함수 호출의 방식을 따르지 않고 함수의 본체가
   호출된 부분에 직접 복사되게 됩니다. 이렇게 되면서 속도의 향상을
   꾀할수 있다. 단지 제한이 되는 경우는

      - 1000줄을 넘을수 없다.
      - for문같은 반복문은 있을수 없다.

   만일 제한 조건을 벚어나게되면 일반함수로 inline을 무시하게 됩니다.

   클래스에서는 클래스 본체에서 함수 정의, 선언을 하면 즉시 inline화
   됩니다.

   class a{
    int z;
    public:
    get(){return z;}     // 자동 inline으로 인식
   };

  []. a++ or ++a ?

   가능하다 operator 선언을 다음처럼 한경우

#include <stdio.h>

class cls{
public:
        int x;
        operator ++()            // ++xx를 위한 것
        {
           x++;
        }

        operator ++(int)        // xx++ 를 위해 의미없는 int인자를 받는다.
        {
                x++;
        }
};

void main()
{
        cls xx;
        xx.x =10;
        printf("%d ",xx.x);
        printf("%d ",xx.x++);
        printf("%d ",++xx.x);

}

10 10 12

'KB > C/C++' 카테고리의 다른 글

volatile  (0) 2004.03.19
몇가지 코드 최적화  (0) 2004.03.19
콤마에 대해서  (0) 2004.03.19
예전 콜링 컨벤션  (0) 2004.03.19
재미로 보는 C/C++언어  (0) 2004.03.19

+ Recent posts