[C++] 28. 가상함수

2022. 6. 10. 19:43코딩 1막 <C++개념편>

728x90
#include <iostream>
#include <string>

using namespace std;

// 가상함수(virtual method)
// 가상함수는 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수
// virtual이라는 예약어를 함수 앞에 붙여서 생성할 수 있다
// 이렇게 생성된 가상함수는 파생 클래스에서 재정의하면 이전에 정의되었던 내용들은 모두 새롭게 정의된 내용들로 교체됩니다.

struct SchoolMember
{
	string name;
	int id;

	SchoolMember()
	{

	}

	SchoolMember(string _name, int _id)
	{
		name = _name;
		id = _id;
	}

	void SetInfo(string _name, int _id)
	{
		name = _name;
		id = _id;

	}

	// virtual showinfo()
	void virtual ShowInfo()
	{
		cout << "교내 맴버의 정보" << endl;
		cout << "이름 : " << name << endl;
		cout << "ID : " << id << endl;
	}
};

struct Teacher : SchoolMember
{
	string subject;

	Teacher()
	{

	}

	Teacher(string _name, int _id, string _subject) : SchoolMember(_name, _id)
	{
		subject = _subject;
	}

	void SetInfo(string _name, int _id, string _subject)
	{
		name = _name;
		id = _id;
		subject = _subject;
	}

	void ShowInfo()
	{
		cout << "선생의 정보" << endl;
		cout << "이름 : " << name << endl;
		cout << "교번 : " << id << endl;
		cout << "담당과목 : " << subject << endl;
	}

	void Teach()
	{
		cout << name << "선생이" << subject << "를 가르친다" << endl;
	}
};

struct Student : SchoolMember
{
	int grade;

	Student()
	{

	}
	Student(string _name, int _id, int _grade) : SchoolMember(_name, _id)
	{
		grade = _grade;
	}

	void SetInfo(string _name, int _id, int _grade)
	{
		name = _name;
		id = _id;
		grade = _grade;
	}

	void ShowInfo()
	{
		cout << "학생의 정보" << endl;
		cout << "이름 : " << name << endl;
		cout << "학번 : " << id << endl;
		cout << "학년 : " << grade << endl;
	}

	void Study()
	{
		cout << name << "학생이 공부한다" << endl;
	}
};

void main()
{
	SchoolMember* schoolMembers[4];

	// 동적할당 -> 생성자와 오버로딩생성자를 만들어줘야함
	Teacher* teacherA = new Teacher("선생a", 0, "물리");
	Teacher* teacherB = new Teacher("선생b", 1, "수학");
	Student* studentA = new Student("학생a", 0, 2);
	Student* studentB = new Student("학생b", 1, 4);

	schoolMembers[0] = teacherA;
	schoolMembers[1] = studentA;
	schoolMembers[2] = teacherB;
	schoolMembers[3] = studentB;

	for (int i = 0; i < 4; i++)
	{
		schoolMembers[i]->ShowInfo(); 
	}
}

출력 결과

* 동적할당부터 생성자, 오버로딩생성자, 오버라이딩, 상속, 가상함수까지 다양한 개념들이 녹아있는 유형이다

* 소스코드를 보고 한문장 한문장 어떤 내용인지 숙지하자!

728x90

'코딩 1막 <C++개념편>' 카테고리의 다른 글

[C++] 30. 벡터(vector)란 무엇인가?  (0) 2022.06.14
[C++] 29. 문자열: string이란?  (0) 2022.06.14
[C++] 27. 상속의 오버라이딩  (0) 2022.06.10
[C++] 26. 상속  (0) 2022.06.10
[C++] 25. 동적배열이란  (0) 2022.06.07