C , C++, C#

C++ 다형성,상속 간단정리

vhxpffltm 2019. 2. 26. 23:16

출처 : https://koocci.github.io/c++/2016/11/17/C++_16.html


상속 - 부모꺼를 자식이 물려받음  -> 자식은 자식꺼 + 부모꺼 사용가능


자식 클래스의 생성자는 자신이 상속한 부모클래스의 맴버를 초기화해야함 -> 부모클래스를 호출하는 방식으로(이니셜라이져사용)

*자식 클래스 객체생성과정은 부모클래스를 무조건 호출!! 명시하지 않으면 부모클래스의 void 생성자 호출

 자식 클래스 객체가 소멸될 떄, 자식 클래스 소멸자 실행 후 부모클래스 소멸자 실행



접근 제한자에서의 상속은 해당 접근 제한자보다 넓은 것들을 지정한 걸로 바꿈

Ex) Class 자식 : private 부모  -> private보다 넓은 맴버는 private로변경 -> 다른 클래스가 솔찍히 접근할 수 없다. (거이 안씀)


상속 : IS-A 관계성립  -> 무선 전화기는 일종의 전화기이다.    무선전화기 is a 전화기


객체 포인터 변수 : 객체의 주소값을 저장하는 포인터 변수 

Person* ptr;

pt = new Person();

-> Persin형 포인터(ptr) 은 Person객체 뿐 아니라 Person을 상속하는 자식 클래스의 객체도 가리킬수 있다 (중요)


C++에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다.(객체의 주소 값을 저장할 수 있다)



Ptr1과 Ptr2는 Person객체로 간주하기 떄문에 Person클래스의 함수만 호출가능
Ptr3은 Student객체로 간주하기 떄문에 Student클래스의 study함수와 student클래스가 상속받는 Person 클래스의 함수 사용가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstring>
 
using namespace std;
 
class Person {
public:
    void Sleep() const {
        cout << "Sleep" << endl;
    }
};
 
class Student : public Person {
public:
    void Study() const {
    cout << "Study" << endl;
    }
};
 
class PartTimeStudent : public Student {
public:
    void Work() const {
        cout << "Work" << endl;
    }
};
 
int main(void) {
    Person* ptr1 = new Student();   //학생은 사람이다.
    Person* ptr2 = new PartTimeStudent();  // 알바학생은 사람이다.
    Student* ptr3 = new PartTimeStudent(); // 알바학생은 학생이다.
    // Student 객체와 ParttimeStudent 객체를 Person객체로 간주 , Parttimestudent객체를 student객체로 간주
    ptr1->Sleep();
    ptr2->Sleep();
    ptr3->Study();
    delete ptr1;
    delete ptr2;
    delete ptr3;
return 0;
}
cs