C언어에서 OOP 하기(2) - 상속
C++에서는 상속이 있으나, C에는 상속이 없다.
하지만 struct 구조체가 메모리에 저장되는 순서를 이용하면 상속과 비슷한 기능을 하는 코드를 사용할 수 있다.
#include <stdio.h>
class Base
{
public:
void printBase() { printf("%d\n", a); };
int a;
};
class Derived : public Base
{
public:
void printDerived() { printf("%d\n", b); };
int b;
};
int main(void)
{
Derived instance;
instance.b = 1;
Base *ptr = &instance;
ptr->a = 3;
ptr->printBase(); // Output: 3
instance.printDerived(); // Output: 1
return 0;
}
위와 같은 c++코드를 c코드로 변환하면 아래와 같다.
#include <stdio.h>
typedef struct _Base
{
int a;
} Base;
void printBase(Base *self) { printf("%d\n", self->a); };
typedef struct _Derived
{
Base base; // 첫번째로 와야 함
int b;
} Derived;
void printDerived(Derived *self) { printf("%d\n", self->b); };
int main(void)
{
Derived instance;
instance.b = 1;
Base *ptr = (Base *)&instance;
ptr->a = 3;
printBase(ptr); // Output: 3
printDerived(&instance); // Output: 1
return 0;
}
Base 구조체는 int a
가 저장되고, Derived의 메모리는 Base base
(int a), int b
순으로 저장된다.
이를 이용해 단순히 포인터를 캐스팅하는 것으로 상속과 같은 효과를 낼 수 있다.
주의해야할 것은 Base 구조체가 첫번째 멤버여야한다는 것이다.
Base base
와 int b
의 위치만 달라져도 동작이 달라진다.
또한 포인터 캐스팅만으로는 다중상속이 불가능한 것을 알 수 있다.
Comments