실습 1 상속화
프로그래밍 언어에 에서 상속하는 문법을 예로 들어 Chat GPT를 이용해서 알아보기.
실습 2 상속 응용
#include <iostream>
using std::cout;
using std::endl;
class A //기본 클래스
{
int x;
public:
void setX(int i) { x = i; }
void showX() { cout << x << endl; }
};
class B :public A {
//아무 것도 없다 그치만.
};
int main()
{
A aa;
aa.setX(1);
aa.showX();
B bb;
bb.setX(10);
bb.showX();
return 0;
}
출력
#include <iostream>
using std::cout;
using std::endl;
class A // 기본 클래스
{
int x;
public :
void setX(int i){x=i;}
void showX(){cout<<x<<endl;}
};
class B:public A //파생 클래스
{
int y;
public:
void setY(int i){y=i;}
void showY(){cout<<y<<endl;}
};
int main()
{
B bb; // 파생클래스의 객체
bb.x=1; // 오류 ① bb.setX(1);
bb.y=2; // 오류 ② bb.setY(2);
bb.showX(); // 기본클래스의 멤버접근
bb.showY(); // 파생클래스의 멤버접근
return 0;
}
bb.x=1 과 bb.y=2 에서 오류가 발생 이유는 클래스 private 함수에 값을 넣을 수 없기 때문에 public 함수인 멤버변수를 이용해 넣어야 함 다음 코드가 해결 방법임.
#include <iostream>
using std::cout;
using std::endl;
class A // 기본 클래스
{
int x;
public:
void setX(int i) { x = i; }
void showX() { cout << x << endl; }
};
class B :public A //파생 클래스
{
int y;
public:
void setY(int i) { y = i; }
void showY() { cout << y << endl; }
};
int main()
{
B bb; // 파생클래스의 객체
bb.setX(1);
bb.setY(2);
bb.showX(); // 기본클래스의 멤버접근
bb.showY(); // 파생클래스의 멤버접근
return 0;
}
출력
실습 3 private 상속 접근 제어
#include <iostream>
using std::cout;
using std::endl;
class A
{
int x = 1;
public:
A() { x = 2; }
//A():x(2){}
void setX(int i) { x = i; }
int getX() { return x; }
};
int main()
{
A a1; //디폴트 생성자는 사라짐
cout << a1.getX() << endl;
return 0;
}
위에 public 함수에 A() {x=2;} 와 A() :x x(2){}는 생성자를 나타내는 것이고 두 개 다 똑같은 의미임.
Private 상속 접근 제어의 용도
#include <iostream>
using std::cout;
using std::endl;
class A
{
int x;
public:
void setX(int i) { x = i; }
void showX() { cout << x << endl; }
};
class B :private A //비공개적으로 상속받는다
{
int y;
public:
void setXY(int i, int j) { setX(i); y = j; }
// 기본 클래스의 public 멤버 접근
void showXY() { showX(); cout << y << endl; }
};
int main()
{
B bb;
bb.setXY(1, 2); // 파생클래스의 멤버접근
bb.showXY(); // 파생클래스의 멤버접근
return 0;
}
실습 4 Protected 상속
#include <iostream>
using std::cout;
using std::endl;
class A
{
protected: //private이라면?
int a, b;
public:
void setAB(int i, int j) { a = i; b = j; }
};
class B :public A
{
int c; // private
public:
void setC(int n) { c = n; }
void showABC() { cout << a << b << c << endl; }
//기본 클래스의 protected 멤버들은
//파생 클래스의 멤버에 의해 접근될 수 있다.
};
int main()
{
A aa;
B bb;
bb.setAB(1, 2);
bb.setC(3);
bb.showABC();
return 0;
}
#include <iostream>
using std::cout;
class A
{
public:
A() { cout << "A의 생성자\n"; }
~A() { cout << "A의 소멸자\n"; }
};
class B :public A
{
public:
B() { cout << "B의 생성자\n"; }
~B() { cout << "B의 소멸자\n"; }
};
int main()
{
B ob;
return 0;
}
메인 함수에서 ob라는 객체를 부르고 B클래스라는 자식 클래스를 먼저 호출 하지 않고 부모클래스인 A클래스를 먼저 호출해서 A의 생성자가 먼저 출력이되고 그다음 B클래스인 자식 클래스 B의 생성자를 출력함. 그리고 소멸자 를 출력할 때는 B클래스가 처음으로 소멸되고 그 다음 부모클래스인 A의 생성자가 마지막으로 소멸된다.
#include <iostream>
using std::cout;
using std::endl;
class A {
int a;
public:
A(int i) {
cout << "A의 생성자\n";
a = i;
}
~A() { cout << "A의 소멸자\n"; }
void showA() { cout << a << '\n'; }
};
class B :public A {
int b;
public:
B(int i, int j) :A(i) {// i는 기본클래스 생성자의 매개변수로 전달
cout << "B의 생성자\n";
b = j;
}
~B() { cout << "B의 소멸자\n"; }
void showB() { cout << b << endl; }
};
int main()
{
B bb(10, 20);
bb.showA();
bb.showB();
return 0;
}
부모 클래스의 생성자가 매개변수를 가지고 있으면 그 매개변수 개수 만큼 자식 클래스의 객체를 만들 때 넘겨줘야 한다.
'C++' 카테고리의 다른 글
C++ 14주차 (0) | 2023.12.07 |
---|---|
C++ 프로그래밍 13주차 (0) | 2023.11.30 |
C++ 프로그래밍 11주차 (0) | 2023.11.16 |
C++ 10주차 (1) | 2023.11.09 |
C++ 8주차 (0) | 2023.11.02 |