<private와 protected 접근 속성의 공통점과 차이점>
- 공통점: 두 접근 제어자 모두 클래스의 외부에서 직접 접근이 불가능, 즉 객체를 통해 멤버 변수에 직접 접근하거나 멤 버 변수를 호출하는 것이 불가능
- 차이점: 1. private멤버는 해당 클래스의 객체에서만 접근 가능, 즉 동일한 클래스의 다른 객체 똔느 상속받은 자식 클 래스 에서도 접근 불가능
2.protected멤버는 해당 클래스와 동일한 클래스의 다른 객체, 그리고 상속받은 자식 클래스에서 접근이 가 능, 하지만 자식 클래스의 객체를 통해서는 접근이 불가능
자식쪽에서 부모쪽으로 매개변수를 넘기는 방법 /부모 생성자가 먼저 생성이 되는데 자식쪽에서 부모쪽으로 매개변수를 넘기는 방법이다
- 파이썬 다중 상속 예시
# 부모 클래스 1
class Parent1:
def __init__(self):
self.parent1 = "부모 클래스1"
def print_parent1(self):
print(self.parent1)
# 부모 클래스 2
class Parent2:
def __init__(self):
self.parent2 = "부모 클래스2"
def print_parent2(self):
print(self.parent2)
# 다중 상속을 받는 자식 클래스
class Child(Parent1, Parent2):
def __init__(self):
Parent1.__init__(self) # 부모 클래스1의 생성자 호출
Parent2.__init__(self) # 부모 클래스2의 생성자 호출
self.child = "자식 클래스"
def print_child(self):
print(self.child)
if __name__ == "__main__":
child = Child()
child.print_parent1() # 부모 클래스1의 메소드 호출
child.print_parent2() # 부모
- 2개의 기본 클래스 상속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의 생성자로
// 각각 매개변수 전달, { c = k; }초기화 하는것
void show() {
cout << getA() << ' ' << getB() << ' ' << c << endl;
}
};
int main()
{
B bb(1, 2, 3);
bb.show();
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;
}
클래스 다이어그램: 위에는 부모 아래는 자식, 자식에서 부모로 화살표(색x)
- 부모 클래스 완성( 사람클래스(Man,멤버변수:이름,나이)를 만드시오.)
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
using std::string;
class Man {
string name;
int age;
public:
Man(std::string n, int a) {
name = n;//초기화
age = a;
}
void m_show() {
cout << "이름:" << name << endl;
cout << "나이:" << age << endl;
}
};
- 사람클래스로부터 상속받은 학생클래스(Student)를 만드시오. (멤버변수:반,학번), 생성자, 기타함수
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
using std::string;
class Man {
string name;
int age;
public:
Man(string name, int age) {
this->name = name;//초기화
this->age = age;
}
//Man(string n, int a) {
// name = n;//초기화
// age = a;
//}
void m_show() {
cout << "이름:" << name << endl;
cout << "나이:" << age << endl;
}
};
class Student : public Man{
string ban;
string hak;
Student(string n, int a, string b, string h) :Man(n,a) {
ban = b;
hak = h;
}
void s_show() {
m_show();
cout << "반:" << ban << endl;
cout << "학번:" << hak << endl;
}
};
- 사람클래스로부터 상속받은 교수(Teacher)클래스를 만드시오. (멤버변수:전공,담당과목), 생성자, 기타함수
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
using std::string;
class Man {
string name;
int age;
public:
Man(string name, int age) {
this->name = name;//초기화
this->age = age;
}
//Man(string n, int a) {
// name = n;//초기화
// age = a;
//}
void m_show() {
cout << "이름:" << name << endl;
cout << "나이:" << age << endl;
}
};
class Student : public Man{
string ban;
string hak;
Student(string n, int a, string b, string h) :Man(n,a) {
ban = b;
hak = h;
}
void s_show() {
m_show();
cout << "반:" << ban << endl;
cout << "학번:" << hak << endl;
}
};
class Teacher : public Man {
string major;
string subject;
Teacher(string n, int a, string m, string s) :Man(n, a) {
major = m;
subject = s;
}
void t_show() {
m_show();
cout << "전공:" << major << endl;
cout << "담당과목:" << subject << endl;
}
};
완성
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
using std::string;
class Man {
protected:
string name;
int age;
public:
Man(string name, int age) {
this->name = name;//초기화
this->age = age;
}
//Man(string n, int a) {
// name = n;//초기화
// age = a;
//}
void m_show() {
cout << "이름:" << name << endl;
cout << "나이:" << age << endl;
}
};
class Student : public Man{
string ban;
string hak;
public:
Student(string n, int a, string b, string h) :Man(n,a) {
ban = b;
hak = h;
}
void s_show() {
m_show();
cout << "반:" << ban << endl;
cout << "학번:" << hak << endl;
}
};
class Teacher : public Man {
string major;
string subject;
public:
Teacher(string n, int a, string m, string s) :Man(n, a) {
major = m;
subject = s;
}
void t_show() {
m_show();
cout << "전공:" << major << endl;
cout << "담당과목:" << subject << endl;
}
};
int main()
{
Student kks("김컴소", 20, "C반", "202012000");
Teacher hsh("한미소", 40, "전산", "C++프로그래밍");
kks.s_show();
hsh.t_show();
return 0;
}
#include <iostream>
using std::cout;
class Dot {//부모클래스
public:
virtual void draw() {cout << "Dot::draw()\n";}//virtual꼭 필요
void print() {
cout << "Dot 클래스\n";
draw();//draw함수 호출
}
};
class Line :public Dot { //자식클래스
public:
void draw() {//void draw() override ,override는 써도 안써도 상관없음
cout <<"Line::draw()\n";}
};
int main() {
Line line;
line.print();
return 0;
}
출처: 1학년 2학기 수업자료/ 한성현 교수님
'C++프로그래밍' 카테고리의 다른 글
c++프로그래밍 15주차 과제 (0) | 2023.12.13 |
---|---|
C++프로그래밍 12주차 과제 (1) | 2023.11.22 |
C++프로그래밍 11주차 과제 (0) | 2023.11.15 |
c++프로그래밍 10주차 과제 (1) | 2023.11.08 |
C++ 프로그래밍 9주차 과제 (0) | 2023.11.01 |