C++

C++ - 다중 상속

도도.__. 2023. 11. 29. 12:08
반응형

다중상속

  • 하나의 클래스가 여러 개의 부모 클래스로부터 상속을 받는 것이다.

다중 상속 예시-1

#include <iostream>
using std::cout;
using std::endl;
class A1 // 아버지
{
	int a;
public:
	A1(int i) { a = i; }
	int getA() { return a; }
};
class A2 // 어머니
{
	int b;
public:
	A2(int i) { b = i; }
	int getB() { return b; }
};
class B :public A1, public A2
{
	// 기본 클래스 A1과 A2로부터
	// 상속 받은 파생 클래스
	int c;
public:
	B(int i, int j, int k) :A1(i), A2(j) { c = k; }
	// i는 기본클래스 A1의 생성자로,
	// j는 기본클래스 A2의 생성자로
	// 각각 매개변수 전달
	void show() {
		cout << getA() << ' ' << getB() << ' ' << c << endl;
	}
};
int main()
{
	B bb(1, 2, 3);
	bb.show();
	return 0;
}

다중 상속 예시-2

#include <iostream>
using std::cout;
using std::endl;
class B1 { //아버지
	double d;
public:
	B1(double dd) { d = dd; }
	double getD() { return d; }
};
class B2 { //어머니
	int i;
public:
	B2(int ii) { i = ii; }
	int getI() { return i; }
};
class D :public B1, public B2 {
	char c;
public:
	D(double dd, int ii, char cc) :B1(dd), B2(ii)
	{
		c = cc;
	}
	void print() {
		cout << "Double : " << getD() << endl;
		cout << "Int : " << getI() << endl;
		cout << "Char : " << c << endl;
	}
};
int main()
{
	D d(1.23, 10, 'H');
	cout << d.getD() << ',' << d.getI() << endl;
	d.print();
	return 0;
}

다중 상속의 생성자와 소멸자

#include <iostream>
using std::cout;
class A1 // 기본 클래스 1
{
	int a;
public:
	A1() { cout << "A1의 생성자.\n"; }
	~A1() { cout << "A1의 소멸자.\n"; }
};
class A2 // 기본 클래스 2
{
	int b;
public:
	A2() { cout << "A2의 생성자.\n"; }
	~A2() { cout << "A2의 소멸자.\n"; }
};
class B : public A1, public A2
	// 기본 클래스 1과 2로부터
	// 상속 받은 파생 클래스
{
	int c;
public:
	B() { cout << "B의 생성자.\n"; }
	~B() { cout << "B의 소멸자.\n"; }
};
int main()
{
	B bb;
	return 0;
}

생성자는 기본 클래스가 지정된 순서대로 왼쪽에서 오른쪽으로 실행되고, 소멸자는 역순으로 실행된다.

상속일 때 클래스 다이어그램

부모와 자식의 관계는 화살표로 표시해주면 된다.(Phone이 자식 Name이 부모임)

★문제

  1. 사람클래스(Man,멤버변수:이름,나이)를 만드시오.
  2. 멤버변수를 초기화하는 생성자를 구현하시오.
  3. 기타 함수를 구현하시오.
  4. 사람클래스로부터 상속받은 학생클래스(Student)를 만드시오.
    (멤버변수:반,학번), 생성자, 기타함수
  5. 사람클래스로부터 상속받은 교수(Teacher)클래스를 만드시오.
    (멤버변수:전공,담당과목), 생성자, 기타함수
  6. main함수에서 학생객체와, 교수객체를 만들어 테스트해보시오.
int main()
{
	Student dodo("도도", 100, "C반", "2023");
	Teacher dolong("도롱", 40, "전산", "C++");
	dodo.s_show();
	dolong.t_show();
	return 0;
}

문제 답

#include <iostream>
using std::cout;
#include <string>
class Man {
	std::string name;
	int age;
public:
	Man(std::string name, int age) { //생성자 함수
		this->name = name; // 매개변수를 n으로 하여 name = n으로 해도 됨.
		this->age = age; // 매개변수를 a로 하여 age = a로 해도 됨.
	}
	void m_show() {
		std::cout << "이름 : " << name << std::endl;
		std::cout << "나이 : " << age << std::endl;
	}
};
class Student : public Man {
	std::string ban;
	std::string hak;
public:
	Student(std::string n, int a, std::string b, std::string h) :Man(n, a){ //생성자 함수
		ban = b;
		hak = h;
	}
	void s_show() {
		m_show();
		std::cout << "반 : " << ban << std::endl;
		std::cout << "학번 : " << hak << std::endl;
	}
};
class Teacher : public Man {
	std::string major;
	std::string subject;
public:
	Teacher(std::string n, int a, std::string m, std::string s) :Man(n, a) { //생성자 함수
		major = m;
		subject = s;
	}
	void t_show() {
		m_show();
		std::cout << "전공 : " << major << std::endl;
		std::cout << "담당과목 : " << subject << std::endl;
	}
};
int main()
{
	Student kks("김컴소", 20, "C반", "2020");
	Teacher hsh("한미소", 40, "전산", "C++");

	kks.s_show();
	hsh.t_show();
	return 0;
}

다중 상속 클래스 다이어그램

protected는 "#"으로 쓴다!

 

반응형

'C++' 카테고리의 다른 글

C++ - 다중상속의 문제점(다이아몬드 문제)  (0) 2023.12.01
C++ - overriding, 가상함수(virtual function)  (0) 2023.11.29
C++ - 상속성  (3) 2023.11.22
C++ - Overloading, Overriding  (1) 2023.11.18
C++ - Default Parameter  (0) 2023.11.15