[C++] 구조체 만들고, 상속해보고, 오버로딩, 오버라이딩 및 가상함수 구현해보기

2022. 6. 10. 21:05코딩 1막 <C++개념편>/코딩 1막 <C++응용편>

728x90

#include <iostream>
#include <string>

using namespace std;

// 1. 부모구조체 : Family / 자식구조체 : Parents, Child 만들고 상속
struct Family
{
	string name;
	int age;

	Family()
	{

	}
	Family(string _name, int _age)
	{
		name = _name;
		age = _age;
	}

	void SetInfo(string _name, int _age)
	{
		name = _name;
		age = _age;
	}

	// 6. 부모의 멤버함수에 virtual 키워드를 붙여 가상함수로 만든 뒤 다시 호출
	void virtual ShowInfo()
	{
		cout << "가족 맴버의 정보" << endl;
		cout << "이름 : " << name << endl;
		cout << "나이 : " << age << endl;
	}
};

struct Parents : Family
{
	string job;

	Parents()
	{

	}

	// 2. 생성자 오버로딩을 구현하고 부모생성자 호출하여 초기화
	Parents(string _name, int _age, string _job) : Family(_name, _age)
	{
		job = _job;
	}

	void ShowInfo()
	{
		cout << "이름 : " << name << endl;
		cout << "나이 : " << age << endl;
		cout << "직업 : " << job << endl;
	}

	void SetInfo(string _name, int _age, string _job)
	{
		name = _name;
		age = _age;
		job = _job;
	}
};

struct Child : Family
{
	string isSchool;

	Child()
	{

	}
	// 2. 생성자 오버로딩을 구현하고 부모생성자 호출하여 초기화
	Child(string _name, int _age, string _isSchool) : Family(_name, _age)
	{
		name = _name;
		age = _age;
		isSchool = _isSchool;
	}
	void ShowInfo()
	{
		cout << "이름 : " << name << endl;
		cout << "나이 : " << age << endl;
		cout << "학교유무 : " << isSchool << endl;
	}

	void SetInfo(string _name, int _age, string _isSchool)
	{
		name = _name;
		age = _age;
		isSchool = _isSchool;
	}
};

void main()
{
	// 3. 부모 및 자식의 포인터 변수 선언
	Family* familysPtr;
	Parents* parentsPtr;
	Child* childsPtr;

	Family* familys[5];
	familys[0] = new Parents("오명섭", 58, "농부");
	familys[1] = new Parents("양정순", 56, "간호공무원");
	familys[2] = new Child("오상현", 28, "대졸");
	familys[3] = new Child("오지연", 27, "대졸");
	familys[4] = new Child("오재권", 25, "대재");

	// 5. 포인터변수를 통해 멤버함수(ShowInfo)를 호출
	for (int i = 0; i < 5; i++)
	{
		familys[i]->ShowInfo();
	}
	cout << endl << endl;

	// 4. 자식의 변수를 하나 선언하여, 그 주소를 부모의 포인터변수에 넣을것(업캐스팅)
	cout << "Family*의 형태로 해석한 parentsA의 주소" << endl;
	familysPtr = familys[0];
	familysPtr->ShowInfo();

	cout << endl;

	// 명시적 형변환을 사용한 다형성
	cout << "Family* 형태를 Parents* 로 형변환하여 해석한 teacherA의 주소" << endl;
	((Parents*)familysPtr)->ShowInfo();
}

출력 결과

728x90