2006년 6월 19일 월요일

[PL]C++ inheritance, subtype 예제.

#include <iostream>
using namespace std;

class Vehicle {
  public:
       int x;

       virtual void f()
       {
           cout << "Vehicle::f()" << endl;
       }

       void g()
       {
           cout << "Vehicle::g()" << endl;
       }
};

class Airplane : public Vehicle {
  public:
       int y;

       virtual void f()
       {
           cout << "Airplane::f()" << endl;
       }

       virtual void h()
       {
           cout << "Airplane::h()" << endl;
       }
};

void inHeap()
{
  Vehicle *b1 = new Vehicle();
  Airplane *d1 = new Airplane();
  b1->x = 1;
  d1->x = 2;
  d1->y = 3;
 
  b1->f();
  b1->g();
  d1->f();
  d1->g();
  d1->h();

  b1 = d1;

  b1->f();
  b1->g();
  b1->h();
}

void onStack()
{
  Vehicle b2;
  Airplane d2;
  b1.x = 4;
  d1.x = 5;
  d1.y = 6;

  b1.f();
  b1.g();
  d1.f();
  d1.g();
  d1.h();

  b1 = d1;

  b1.f();
  b1.g();
  b1.h();
}

void main()
{
  inHeap();
  onStack();

  return 0;
}

$ g++ a.cpp -g -W -Wall
-------------------------------------------------------
Vehicle::Vehicle()
Vehicle::Vehicle()
Airplane::Airplane()

Vehicle::f()
Vehicle::g()

Airplane::f()
Vehicle::g()
Airplane::h()

Airplane::f() // 자신을 계속 Airplane이라고 생각하고 있다.
Vehicle::g()

Vehicle::Vehicle()
Vehicle::Vehicle()
Airplane::Airplane()

Vehicle::f()
Vehicle::g()

Airplane::f()
Vehicle::g()
Airplane::h()

Vehicle::f()
Vehicle::g()
-------------------------------------------------------
heap에 넣으면 subtype시 자신임을 그대로 유지하고
stack에 넣으면 subtype시 parent가 된다.
그리고 subtype시 두 경우 모두 자신에게만 나타나는 member function은 부를 수 없다.

사실 subtype과 inheritance는 다른 개념이지만 C++에서는 혼용해서 쓰고 있다.
C++은 public base class inheritance를 subtype으로 간주한다.
(반례 - deque를 상속해서 stack, queue를 만드는 경우 inheritance와 subtype의 방향이 반대이다.)

댓글 없음:

댓글 쓰기