상속이란?
흔히 상속이라 하면 부모가 자식에게 무언가를 물려줄 때 많이 사용한다.
프로그래밍에서 상속이란 프로그램에 확장성을 위해 코드에 변경을 줄이면서 비슷한 기능을 하는 여려개의 클래스들에 관계를 나타낼 때 사용합니다.
#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 클래스에 생성자가 불러오게 되는 것입니다.
따라서 여기서 또 한번 중요하게 강조해야 하는 점이 있습니다. 바로
클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 된다는 것입니다.
'c++ > 상속(Inheritance)의 이해' 카테고리의 다른 글
[C++] Protected 선언과 세 가지 형태의 상속 (0) | 2023.01.06 |
---|