728x90
반응형
팥빙수 클래스를 만들어 보았다!
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
|
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include <string>
using namespace std;
class Ice {
public:
Ice() { cout << "Ice()" << endl; }
~Ice() { cout << "~Ice()" << endl; }
};
class Pat {
public:
Pat() { cout << "Pat()" << endl; }
~Pat() { cout << "~Pat()" << endl; }
};
class Bingsoo {
public:
Bingsoo() {
cout << "Bingsoo()" << endl;
}
~Bingsoo() {
cout << "~Bingsoo()" << endl;
}
private:
Ice ice;
};
class PatBingsoo :public Bingsoo {
public:
PatBingsoo() { cout << "PatBingsoo()" << endl; }
~PatBingsoo() { cout << "~PatBingsoo()" << endl; }
private:
Pat pat;
};
int main() {
PatBingsoo* p = new PatBingsoo;
delete p;
}
|
cs |
소멸자는 생성자 호출의 역순이 된다.
멤버가 먼저 출력되는 이유는 결국에 생성자가 멤버를 초기화하기 때문이다.
그래서 PatBingsoo의 부모 클래스인 Bingsoo로 들어가는데 Bingsoo의 생성자에서 멤버인 Ice를 먼저 초기화하니까
Ice의 생성자 부터 호출되는 것이다.
근데 만약에 Ice ice가 아니라 Ice *ice로 포인터변수로 선언해주면 Ice의 생성자가 호출되지 않는다.
Ice ice이면 타입 자체가 Ice이기에 멤버가 생성되는 동시에 생성자 호출된다.
Ice *ice이면 ice를 가리키는 포인터가 있다. 근데 이건 Ice타입의 객체가 아니다. 그래서 생성자가
호출되지 않는다.
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
|
class Ice {
public:
Ice() { cout << "Ice()" << endl; }
~Ice() { cout << "~Ice()" << endl; }
};
class Pat {
public:
Pat() { cout << "Pat()" << endl; }
~Pat() { cout << "~Pat()" << endl; }
};
class Bingsoo {
public:
Bingsoo() {
cout << "Bingsoo()" << endl;
ice = new Ice;
}
~Bingsoo() {
cout << "~Bingsoo()" << endl;
delete ice;
}
private:
Ice* ice;
};
class PatBingsoo :public Bingsoo {
public:
PatBingsoo() {
cout << "PatBingsoo()" << endl;
pat = new Pat;
}
~PatBingsoo() {
cout << "~PatBingsoo()" << endl;
delete pat;
}
private:
Pat* pat;
};
int main() {
Bingsoo* p = new PatBingsoo;
delete p;
}
|
cs |
부모클래스의 포인터인 Bingsoo가 자식클래스인 PatBingsoo를 가리키는 상황이다.
ice와 pat을 동적할당해볼 것이다.
PatBingsoo 와 Pat 생성자는 호출되는데 소멸자가 호출되지 않는다.
p는 Bingsoo타입이 들어있다. 만약 코드가 길어지게 된다면 컴파일러가 할 수 있는
최선은 부모클래스인 Bingsoo타입의 소멸자를 호출하는 것이다.
왜냐면 C++은 정적바인딩이 기본적으로 되어있기에
Bingsoo라는 소멸자가 정적 바인딩 되기 때문이다.
그래서 PatBingsoo소멸자로 동적바인딩을 할 수 없다.
소멸자도 가상함수가 될 수 있다!
내가 PatBingsoo소멸자를 동적바인딩하고 싶으면 정적바인딩 되어있는 Bingsoo 소멸자에
virtual을 걸어주면 되는 것이다!
728x90
반응형
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++] 다중상속 (0) | 2022.07.13 |
---|---|
[C++] 상속에서의 형변환 (💢static_cast다시보기) (0) | 2022.07.12 |
[C++] 순수가상함수와 추상클래스 (0) | 2022.07.12 |
[C++] 오버라이딩과 정적바인딩 / 가상함수와 동적바인딩 (0) | 2022.07.10 |
Polygon 연습문제 (0) | 2022.07.10 |
댓글