091
[C/C++] 상속 본문
01. 상속(Inheritance)
//class 파생클래스명 : 상속접근제어 기본클래스명 {};
class Dog : public Animal {};
- 기본 클래스 : 다른 언어에서는 부모 클래스로 주로 불리며, 상속을 하는 클래스
- 파생 클래스 : 다른 언어에서는 자식 클래스로 주로 불리며, 상속을 받는 클래
- 상속 접근 제어자 : 접근 제어자인 public, protected, private를 기본 클래스명 앞에 작성하여 기본 클래스에서 상속받은 멤버들이 파생 클래스 안에서 어떤 접근 속성을 갖게할지 제어함 -> 기본 클래스의 속성이 private일 경우에는 어떤 방식으로도 상속받을 수 없음 !
- 인클래스 멤버 초기화(In-class member initializers) : 클래스 내부에서 초기값을 직접 설정할 수 있는 초기화 방법 -> 생성자와 함께 사용 시 생성자 함수가 우선 시 되면서 내부 클래스 초기화는 무시됨
#include <iostream>
using std::cout;
using std::endl;
class A {
int x = 1 ;
public:
A():x(2){}
void setX(int i) { x = i; }
int getX() { return x ; }
};
int main() {
A a1; //디폴트 생성자는 사라짐
cout << a1.getX()<<endl; //2
return 0;
}
- protected와 private 차이점 : 기본 클래스에서 private 멤버 속성을 유지하면서 파생 클래스가 접근하는 것이 가능하도록 하는 경우에 사용하는 것이 protected로 외부에서 접근하지 못하는 것은 동일하지만 파생클래스의 멤버에 의해 접근될 수 있다는 것을 제외하고는 private 접근과 같음
- 파생 클래스의 객체를 선언하고 나면 기본 클래스의 생성자가 먼저 호출되고 파생 클래스의 생성자가 그 다음으로 호출됨 -> 객체가 소멸할 때는 파생 클래스의 소멸자가 우선적으로 호출되고 그 다음으로 기본 클래스의 소멸자가 호출됨
- 만약에 기본 클래스의 생성자에 매개변수가 필요한 상황일 때는 파생클래스의 생성자를 정의할 때 함께 전달 매개변수를 작성해줘야함
//파생클래스생성자(매개변수 리스트) : 기본클래스생성자(매개변수리스트) {};
class A{
int a;
public :
A(int i):a(i){ cout<<"A의 생성자\n";}
~A(){cout<<"A의 소멸자\n";}
void showA(){cout<<a<<'\n';}
};
class B:public A{
int b;
public:
B(int i, int j):A(i), b(j){ cout<<"B의 생성자\n"; } //i는 기본클래스 생성자의 매개변수로 전달
~B(){cout<<"B의 소멸자\n";}
void showB(){cout<<b<<endl;}
};
- 계층적 다중상속 및 동시 상속
//class 파생클래스명 : 상속접근제어1 기본클래스명1, 상속접급제어2 기본클래스명2...{};
class Child : public Father, public Mother {};
> 동시 상속의 경우의 작성한 순서대로 각 클래스의 생성자가 호출됨 -> Father의 생성자 그 다음이 Mother의 생성자
03. 응용 : 사람클래스
#include <iostream>
using namespace std;
class Man{
protected:
string name;
int age;
public:
Man(string name ="이름", int age = 0): name(name),age(age){}
string getName() const { return name; }
int getAge() const { return age; }
void setName(string name) { this->name = name; }
void setAge(int age) { this->age = age; }
void m_show() const{
cout<<"이름 : "<<name<<endl;
cout<<"나이 : "<<age<<endl;
}
};
class Student : public Man{
string sClass;
string sID;
public:
Student(string name, int age, string sClass,string sID):Man(name,age),sClass(sClass),sID(sID){}
string getSClass() const { return sClass; }
string getSID() const { return sID; }
void setSClass(string sClass) { this->sClass = sClass; }
void setSID(string sID) { this->sID = sID; }
void s_show() const {
m_show();
cout<<"반 : "<<sClass<<endl;
cout<<"학번 : "<<sID<<endl;
}
};
class Teacher : public Man{
string major;
string subject;
public:
Teacher(string name, int age, string major,string subject):Man(name,age),major(major),subject(subject){}
string getMajor() const { return major; }
string getSubject() const { return subject; }
void setMajor(string major) { this->major = major; }
void setSubject(string subject) { this->subject = subject; }
void t_show() const {
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;
}
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] 템플릿, STL (2) | 2024.12.16 |
---|---|
[C/C++] 오버라이딩:가상함수 (1) | 2024.12.16 |
[C/C++] 함수중첩(멤버함수,생성자), 디폴트 인자(매개변수) (1) | 2024.12.15 |
[C/C++] const, 동적 메모리할당(new, delete) (2) | 2024.12.15 |
[C/C++] 배열, 포인터, 생성자&소멸자 (1) | 2024.12.15 |