c++/상속(Inheritance)의 이해

[C++] 상속의 문법적인 이해

TIM_0529 2023. 1. 5. 14:47
반응형

상속이란?

흔히 상속이라 하면 부모가 자식에게 무언가를 물려줄 때 많이 사용한다. 

프로그래밍에서 상속이란 프로그램에 확장성을 위해 코드에 변경을 줄이면서 비슷한 기능을 하는 여려개의 클래스들에 관계를 나타낼 때 사용합니다.

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

class Person
{
	int age;
	char name[50];
public:
	Person(int my_age,const char* my_name) : age(my_age)
	{
		strcpy_s(name, my_name);
	}
	void WhatYourName()
	{
		cout << "My name is " << name << endl;
	}
};

class Student:public Person
{
	char major[50];

public:
	Student(const char* my_name, int age, const char* my_major) :Person(age, my_name)
	{
		strcpy(major, my_major);
	}
	void WhoAreYou()
	{
		WhatYourName();
		cout << "My major is " << major << endl;
	}
};

int main()
{
	Student st("Lee", 24, "CS");
	st.WhoAreYou();
}

실행결과

위 코드를 보면 Student 클래스가 Person 클래스를 상속을 받았습니다. 이는 다음으로 이야기 할 수 있습니다.

 

 Student = 자식 객체                     Person = 부모 객체 

 

자식 객체는 부모객체에 멤버 변수 또는 함수에 접근할 수 있습니다.

하지만 접근제한 지시자가 public이 아닌 private 으로 되어 있다면 자식객체에서는 잡근을 할 수가 없습니다.

위 코드에서는 Person에서 선언한 WhatYourName()함수를 Student 객체 내에서 바로 사용한 것을 확인할 수 있습니다.

이것이 상속을 사용한 이유입니다.


상속 사용시 주의할 점

자식객체는 부모객체에 멤버를 초기화할 의무가 있습니다.

상속을 하게 되면 상속의 대상이 되는 클래스의 맴버까지도 객체 내에 포함이 되기 때문에 반드시 초기화를 해 줘야 합니다. 

초기화는 생성자를 불러올 때 해 주도록 합니다.

 

 


유도 클래스의 객체 생성과정

유도 클래스의 객체가 생성되는 시점은 객체의 상속을 사용할 때 꼭 알고 있어야 한다.

 

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

class Person
{
	int age;
	char name[50];
public:
	Person(int my_age, const char* my_name) : age(my_age)
	{
		strcpy_s(name, my_name);
		cout << "Person called" << endl;
	}
	void WhatYourName()
	{
		cout << "My name is " << name << endl;
	}
};

class Student :public Person
{
	char major[50];

public:
	Student(const char* my_name, int age, const char* my_major) :Person(age, my_name)
	{
		strcpy(major, my_major);
		cout << "Student called" << endl;
	}
	void WhoAreYou()
	{
		WhatYourName();
		cout << "My major is " << major << endl;
	}
};

int main()
{
	Student st("Lee", 24, "CS");
	st.WhoAreYou();
}

실행결과

Student 객체에 생성자를 통해 초기화를 해주는 과정에서 컴파일러는 Student 클래스에 부모 클래스인 Person 클래스의 생성자를 먼저 들어가게 된다. 그 결과로 Student 생성자가 아닌 Person 클래스에 생성자가 먼저 실행되고 그 다음에 Student 클래스에 생성자가 불러오게 되는 것입니다.

따라서 여기서 또 한번 중요하게 강조해야 하는 점이 있습니다. 바로

클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 된다는 것입니다.

 

반응형