[C++] 인터페이스에 관한 팁 (순수가상함수)

2021. 6. 9. 22:17·Programming/C++

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;
}
Colored by Color Scripter
cs

 

우리의 C++ 은 정말 정말로 신경을 많이 써 줘야 하는 언어라서

delete 시에 virtual 을 지정해 주지 않으면 인터페이스에 연결된 소멸자조차 제대로 실행시키지 않는다.

위에서 ~B() 메소드는 실행되지 않는다.

7행에 위치한 가상소멸자 주석을 해제시키면,

인터페이스를 상속받은 객체의 소멸자가 제대로 동작한다.

 

※ 인터페이스 가상소멸자에 {} 선언부를 기재하지 않으면 LNK2019 / LNK1120 에러가 발생한다.

 

 

 

 

2. 순수 가상함수에서 =0 을 붙이는 이유

 

C++ pure virtual function have body

Pure virtual functions (when we set = 0) can also have a function body. What is the use to provide a function body for pure virtual functions, if they are not going to be called at all?

stackoverflow.com

 

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.
}
Colored by Color Scripter
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
'Programming/C++' 카테고리의 다른 글
  • [C++] std::thread vs std::async
  • [C++] 동적 라이브러리 vs 정적 라이브러리 개인 의견
  • [C++] 다형성 vitual 키워드에 관한 팁
  • [C++] openSSL Hash 사용법
Cyp
Cyp
  • Cyp
    Cyp Software Blog
    Cyp
  • 전체
    오늘
    어제
    • Cyp Blog (163)
      • Artificial Intelligence (40)
        • Article (21)
        • Post (2)
        • Basic (14)
        • Preferences (3)
      • Cyber Security (1)
      • Programming (46)
        • C++ (21)
        • C# (19)
        • Python (2)
        • Rust (0)
        • Java (1)
      • Algorithm (17)
        • BACKJOON (15)
      • Operating System (14)
        • WSL (2)
        • Windows (1)
        • Linux (5)
        • Security (3)
      • Tools (26)
        • Docker (3)
        • DataBase (2)
        • SSH (1)
        • Doxygen (2)
        • Etc (17)
      • Miscellaneous (19)
        • Book (2)
        • Hardware (2)
        • Hevel (1)
  • 블로그 메뉴

    • Home
    • Guest Book
  • 공지사항

    • 블로그 업데이트 노트
    • 블로그 운영방침
  • 인기 글

  • 태그

    UTF-8 without BOM
    y-cruncher
    utf-8 bom
    C4819
    Bom
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Cyp
[C++] 인터페이스에 관한 팁 (순수가상함수)
상단으로

티스토리툴바