반응형
다중상속
- 하나의 클래스가 여러 개의 부모 클래스로부터 상속을 받는 것이다.
다중 상속 예시-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이 부모임)
★문제
- 사람클래스(Man,멤버변수:이름,나이)를 만드시오.
- 멤버변수를 초기화하는 생성자를 구현하시오.
- 기타 함수를 구현하시오.
- 사람클래스로부터 상속받은 학생클래스(Student)를 만드시오.
(멤버변수:반,학번), 생성자, 기타함수 - 사람클래스로부터 상속받은 교수(Teacher)클래스를 만드시오.
(멤버변수:전공,담당과목), 생성자, 기타함수 - 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 |