<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

+ Recent posts