1. 소멸자
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
|
#include <iostream>
class AAA
{
public:
//virtual ~AAA() {};
virtual void print() = 0;
};
class A
{
public:
A() {};
int b = 10;
virtual void print()
{
std::cout << b << std::endl;
}
};
class B : public AAA
{
public:
B() {};
int a = 20;
~B()
{
std::cout << "destroy B" << std::endl;
}
void print() override
{
std::cout << a << std::endl;
}
};
int main()
{
AAA* a = new B();
a->print();
delete a;
}
|
cs |
우리의 C++ 은 정말 정말로 신경을 많이 써 줘야 하는 언어라서
delete 시에 virtual 을 지정해 주지 않으면 인터페이스에 연결된 소멸자조차 제대로 실행시키지 않는다.
위에서 ~B() 메소드는 실행되지 않는다.
7행에 위치한 가상소멸자 주석을 해제시키면,
인터페이스를 상속받은 객체의 소멸자가 제대로 동작한다.
※ 인터페이스 가상소멸자에 {} 선언부를 기재하지 않으면 LNK2019 / LNK1120 에러가 발생한다.
2. 순수 가상함수에서 =0 을 붙이는 이유
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
|
struct S
{
virtual void foo() = 0;
};
void S::foo()
{
// body for pure virtual function `S::foo`
}
struct D : S
{
void foo()
{
S::foo();
// Non-virtual call to `S::foo` from derived class
this->S::foo();
// Alternative syntax to perform the same non-virtual call
// to `S::foo` from derived class
}
};
int main()
{
D* d = new D();;
d->S::foo();
S* s = new D();
s->foo();
// Another non-virtual call to `S::foo`
//S* s = new S();
// Error.
}
|
cs |
순수 가상 함수가 포함된 클래스의 '형' 을 가지고 선언은
캐스팅을 제외한 선언이 불가능하다. (29행 O, 33행 X)
따라서 33행에 위치한 할당식은 에러가 난다.
하지만 '캐스팅' 포인터를 통한 부모객체인 순수가상 함수에 접근하는것은 가능하다.
때문에 = 0 이 아닌 선언 ( { } ) 이 되어있는 함수는 제아무리 virtual 이라도 '실행' 이 가능한 것이다.
하지만, 그렇다고 그냥 선언만 해 두면 warning 이 발생한다.
즉, '순수가상함수' 에서 =0 을 붙이는 이유는
1) 정적 접근을 막기 위해
2) intellisense warning 을 피하기 위해 사용 안할시
3) 컴파일러 error 를 피하기 위해 사용할시
일반적으로 = 0 을 붙여놓고 위처럼 선언부를 기재하는 실수는 거의 하지 않는다.
위 예제는 극단적인 예제이나, = 0 을 붙이는 이유를 알 수 있다.
'Programming > C++' 카테고리의 다른 글
[C++] std::thread vs std::async (0) | 2021.09.17 |
---|---|
[C++] 동적 라이브러리 vs 정적 라이브러리 개인 의견 (0) | 2021.08.22 |
[C++] 다형성 vitual 키워드에 관한 팁 (0) | 2021.06.09 |
[C++] openSSL Hash 사용법 (0) | 2021.05.12 |
[C++] C# 측으로 Struct 를 UDP 로 전송 (0) | 2021.04.15 |