#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의 방향이 반대이다.)