[C++] 상속과 다형성

상속이란?

기존 정의되어 있는 객체의 속성과 메소드를 물려받아 새로운 클래스로 재정의하는 것 입니다.
현실에서 상속은 말그대로 부모로부터 자식이 물려받는 것을 말합니다.
이는 객체지향에서도 적용되며, 부모클래스의 속성과 메소드를 자식클래스가 물려받을 수 있습니다.

 

다형성이란?

상속받은 메소드를 재구현하여 같은 이름의 함수를 다양하게 호출할 수 있는 것 입니다.
부모 클래스의 메소드를 자식클래스에서 이름은 바꾸지않고 내용만 바꾸어 호출시키며 사용할 수 있습니다.

 

 


상속은 클래스 선언시에 " : (접근지정자) 부모클래스이름" 방식으로 작성해주면 됩니다.

 

사람클래스와 학생클래스를 상속으로 부모 자식관계로 만들어 main함수에서 호출시켜보겠습니다.

 

person클래스

#pragma once
#include <iostream>

using namespace std;

class person {
protected:
	int age=0;
	string name="unkown";
	int height=0;
	int weight=0;

public:
	person(int Age, string Name, int Height, int Weight); //생성자
	~person();
	person() {};
	void print() {
		cout << "이름: " << name << "/나이: " << age << "/키: " << height << "/몸무게:"
			<< weight << "\n";
	}
};

person::person(int Age, string Name, int Height, int Weight)
{
	this->age = Age;
	this->name = Name;
	this->height = Height;
	this->weight = Weight;
}

person::~person() {
	cout << "person객체 소멸" << "\n";
}

 

student클래스

#pragma once
#include "person.h" //person헤더파일을 포함시킴

class student : public person {
private:	
	int grade; //학년

public:
	student(int Age, string Name, int Height, int Weight, int Grade); //생성자
	~student();

	void print() { //person클래스의 print()함수 재정의
		cout << "이름: " << name << "/나이: " << age << "/키: " << height << "/몸무게:"
			<< weight << "/학년: "<<grade << "\n";
	}
};

student::student(int Age, string Name, int Height, int Weight, int Grade)
{
	this->age = Age;
	this->name = Name;
	this->height = Height;
	this->weight = Weight;
	this->grade = Grade;
}

student::~student() {
	cout << "student객체 소멸" << "\n";
}

 

코드를 보시면 student클래스의 속성이 grade만 추가되어있고 그 외에는 부모클래스로부터 속성값을 물려받아 사용하는 것을 보실 수 있습니다.

또한 print()함수를 재정의 하여 학생클래스에서는 학년까지 출력시키는 습니다.

student생성자를 저렇게 사용하려면 person에 기본생성자(디폴트생성자)가 필요합니다.

 

이제 Main함수를 통해 학생과 사람 클래스를 호출하여 print()함수와 소멸자를 호출시켜보겠습니다.

 

Main.cpp

#include "student.h"


int main() {
	person per(20, "사람", 181, 74);
	student stu(15, "학생", 170, 60, 2);

	per.print();
	stu.print();
}

 

 

생성자의 매개변수대로 값을 전달시켜주어 생성하고 각 print()메소드를 호출시킨 결과입니다.

print()로 값이 출력이 되고

소멸자 호출순서가 학생 다음으로 person이 나옵니다. 근데 person이 두번 소멸되었죠?

이는 C++에서 클래스의 소멸자는 객체가 소멸될 때 자동으로 호출되며, 클래스의 계층 구조에서 상위 클래스와 하위 클래스에 각각 소멸자가 정의되어 있을 때, 해당 객체가 소멸될 때 각각의 소멸자가 호출되는 특성을 나타냅니다.

 

이상입니다.

'C++ > 객체지향' 카테고리의 다른 글

[C++] 생성자와 소멸자  (0) 2023.11.04
[C++] 접근지정자 - (public/private/protected)  (0) 2023.10.27
[C++] 객체 - 객체지향 첫시작  (1) 2023.10.23