반응형

C++ Inheritance(상속)

  • 어떤 클래스가 다른 클래스와 기반(base) 파생(derived) 관계를 가질때, 파생클래스 에서는 기반클래스의 필드(멤버변수)   메소드(멤버함수) 들을 사용할 있다.
  • 하지만 기반 클래스의 private 변수,함수 들은, 파생클래스에서도 접근이 불가능하다, protected, public 가능하다, 반면에 friend 키워드를 쓰면 가능하긴하다(friend 상속에 관계없이, 모든 변수, 함수에 접근할 있도록 접근 허용 권한을 주는것)

 

 

 

상속 관계 짓는 방법

클래스를 디자인할때, 콜론(:) 넣고 뒤에 접근제어자와 다른 클래스의 이름 붙이면 된다

 

ex1)

 

파생클래스 : 외부접근권한 기반클래스

class MyClassB : public MyClassA

 

 

이때 외부 접근권한을 public, private 정해 있는데

public 경우 클래스 외부에서도 기반 클래스의 public 변수, 함수들에 접근할 있게 되고

private 경우 파생클래스만 기반 클래스의 public 변수 함수들에 접근할 있다

 

 

ex2)

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class CParent
{
public:
    CParent()
        :m_iA(0),m_iB(0),m_iC(0)
    {
        std::cout << "CParent 생성자" << std::endl;
    }
    
    ~CParent()
    {
        std::cout << "CParent 소멸자" << std::endl;
    }
public:
    int        m_iA;
 
protected:
    int        m_iB;
 
private:
    int        m_iC;
 
public:
    void Output()
    {
        std::cout << "A : " << m_iA << std::endl;
        std::cout << "B : " << m_iB << std::endl;
        std::cout << "C : " << m_iC << std::endl;
    }
};
 
class CChild : public CParent
{
public:
    CChild()
        :m_iD(0)
    {
        m_iB = 200;
        // m_iC는 private 이기 때문에 자식 내부에서도 접근이 불가능 하다
        //m_iC = 300; // error
        std::cout << "CChild 생성자" << std::endl;
    }
 
    ~CChild()
    {
        std::cout << "CChild 소멸자" << std::endl;
    }
 
protected:
    int        m_iD;
};
 
class  CChild1 : private CParent
{
public:
    CChild1()
        :m_iD(0)
    {
        m_iA = 100;
        m_iB = 200;
        std::cout << "CChild1 생성자" << std::endl;
 
    }
 
    ~CChild1()
    {
        std::cout << "CChild1 소멸자" << std::endl;
    }
 
private:
    int        m_iD;
};
 
class CChildChild : public CChild
{
public:
    CChildChild()
        :m_iE(0)
    {
        m_iD = 500;
        std::cout << "CChildChild 생성자" << std::endl;
    }
 
    ~CChildChild()
    {
        std::cout << "CChildChild 소멸자" << std::endl;
 
    }
 
private:
    int        m_iE;
};
 
 
int main(void)
{
    /*
    상속 관계에서의 생성자 호출 순서 : 부모 -> 자식 순으로 호출됨
    상속관계에서의 소멸자 호출 순서 : 자식 -> 부모 순으로 호출됨
    */
    CParent            parent;
    std::cout << std::endl;
    CChild            child;
    std::cout << std::endl;
    CChild1            child1;
    std::cout << std::endl;
    CChildChild        childchild;
    std::cout << std::endl;
 
    parent.m_iA = 100;
 
    child.m_iA = 200;
 
    // CChild1 클래스는 CParent를 private 상속을 하고 있으므로 CParent에 
    // Public으로 설정되어있는 멤버들도 외부에서는 접근이 불가능하다.
    //child1.m_iA = 300;
    //child1.Output();
 
 
    return 0;
}
cs

실행화면

 

정리

  1. 상속관계에서 파생 클래스는 기반 클래스의 생성자를 먼저 호출한뒤 그 다음에 파생 클래스의 생성자를 호출한다 
  2. 소멸자는 생성자의 역순으로 호출된다, 즉 파생클래스 소멸자 -> 기반 클래스 소멸자 순으로 호출 된다
  3. 파생클래스 : public 기반클래스 -> 외부에서도 기반 클래스의 public 변수및 함수 접근 가능,                             
  4. 파생클래스 : private 기반클래스 -> 외부에서 기반클래스의 모든 변수 및 함수 접근 불가능
  5. protected 접근 제어자는 파생클래스가 기반클래스의 변수 또는 함수에 접근할 수 있도록 해준다
반응형

+ Recent posts