[C++] 상속

KWANHO PARK·2025년 4월 19일

CPP

목록 보기
17/24
/*
	Inheritance(상속)
	private, public, protected
	is a(무엇은 무엇이다.), has a(소유) 관계 성립해야 함
*/
#include <iostream>
#include <string.h>

class Human {						// 부모 클래스, 기초 클래스, 슈퍼 클래스, 베이스 클래스
private:
	char name[20];
	int age;
public:
	Human(const char*, int);
	void getData();
};

class Student : public Human {		// 자식 클래스, 파생 클래스, 서브 클래스, 드라이버드 클래스
private:
	int studentId;
public:
	Student(const char*, int, int);
	void showStudent();
};

Human::Human(const char* aname, int aage) {
	strcpy_s(name, aname);
	age = aage;
}
void Human::getData() {
	std::cout << "이름: " << name << ", " << "나이: " << age << std::endl;
}

// 상속받은 멤버들은 상속한 부모클래스의 생성자에서 초기화
Student::Student(const char* aname, int aage, int astudentId) : Human(aname, aage) {			// 콜론 초기화로 부모 생성자를 불러와야함
	/*strcpy(name, aname);
	age = aage;*/
	studentId = astudentId;
}
void Student::showStudent() {
	//std::cout << "이름: " << name << std::endl;	안 됨
	std::cout << "학번: " << studentId << std::endl;
}

int main()
{
	Human h("호날두", 31);
	h.getData();

	Student h2{ "메시", 30, 202503 };
	h2.getData();
	h2.showStudent();
	return 0;
}

/*
	protected 접근제어는 상속 받은 자식이 접근 가능
*/
#include <iostream>

class Human {
protected:
	char name[20];
	int age;
public:
	Human(const char* aname, int aage) {
		strcpy_s(name, aname);
		age = aage;
	}
	void getData() {
		std::cout << "이름: " << name << ", " << "나이: " << age << std::endl;
	}
};

class Student : public Human {
private:
	int studentId;
public:
	Student(const char* aname, int aage, int astudentId) : Human(aname, aage) {
		studentId = astudentId;
	}
	void showStudent() {
		std::cout << "이름: " << name << ", " << "나이: " << age << ", " << "학번: " << studentId << std::endl;

	}
};

int main()
{
	Human h("호날두", 31);
	h.getData();
	
	Student h2{ "메시", 30, 202503 };
	h2.getData();
	h2.showStudent();
	return 0;
}

/*
	상속관계에서 이니셜라이즈 사용
*/
#include <iostream>

class Car {
private:
	int gasolineGauge;
public:
	Car(int gauge) : gasolineGauge(gauge) {

	}
	int getGauge() {
		return gasolineGauge;
	}
};

class HybridCar : public Car {
private:
	int electricGauge;
public:
	HybridCar(int gauge, int elecGauge) : Car(gauge), electricGauge(elecGauge) {

	}
	int getElectricGauge() {
		return electricGauge;
	}
};

class HybridWater : public HybridCar {
	int waterGauge;
public:
	HybridWater(int gauge, int elecGauge, int watGauge) : HybridCar(gauge, elecGauge), waterGauge(watGauge) {

	}
	void showGauge() {
		std::cout << "잔여 가솔린: " << getGauge() << std::endl;
		std::cout << "잔여 전기량: " << getElectricGauge() << std::endl;
		std::cout << "잔여 워터량: " << waterGauge << std::endl;
	}
};

int main()
{
	HybridWater hwc(10, 20, 30);
	hwc.showGauge();
	return 0;
}

/*
	상속 관계에서 객체 생성 및 소멸
*/
#include <iostream>

class SuperClass {
private:
	int num;
public:
	SuperClass(int anum) {
		num = anum;
		std::cout << num << ", " << "SuperClass Constructor Call" << std::endl;
	}
	~SuperClass() {
		std::cout << num << ", " << "SuperClass Destructor Call" << std::endl;
	}
};

class SubClass : public SuperClass {
private:
	int subNum;
public:
	SubClass(int anum, int asnum) : SuperClass(anum) {
		subNum = asnum;
		std::cout << subNum << ", " << "SubClass Constructor Call" << std::endl;
	}
	~SubClass() {
		std::cout << subNum << ", " << "SubClass Destructor Call" << std::endl;
	}
};

int main()
{
	SuperClass s{ 1 };
	std::cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
	SubClass sub{ 2, 22 };
	return 0;
}
/*
	객체를 생성할 때 호출되는 생성자와 생성자의 실행은 다름
	즉 생성자의 호출과 생성자의 실행은 다름
*/

0개의 댓글