C언어에서 OOP 하기(2) - 상속

1 minute read

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 baseint b의 위치만 달라져도 동작이 달라진다.
또한 포인터 캐스팅만으로는 다중상속이 불가능한 것을 알 수 있다.

Categories:

Updated:

Comments