091

[C/C++] 상속 본문

Programming Language/C&C++

[C/C++] 상속

공구일 2024. 12. 15. 23:40
728x90

01. 상속(Inheritance)

//class 파생클래스명 : 상속접근제어 기본클래스명 {};
class Dog : public Animal {};

- 기본 클래스 : 다른 언어에서는 부모 클래스로 주로 불리며, 상속을 하는 클래스

- 파생 클래스 : 다른 언어에서는 자식 클래스로 주로 불리며, 상속을 받는 클래

- 상속 접근 제어자 : 접근 제어자인 public, protected, private를 기본 클래스명 앞에 작성하여 기본 클래스에서 상속받은 멤버들이 파생 클래스 안에서 어떤 접근 속성을 갖게할지 제어함 -> 기본 클래스의 속성이 private일 경우에는 어떤 방식으로도 상속받을 수 없음 !

 

상속 접근제어 속성 : 대개 public을 사용

- 인클래스 멤버 초기화(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;
}

 

 

728x90