컴퓨터 언어/C++

[C++] C++ 14일차 가상함수와 추상클래스

훈츠 2020. 4. 16. 18:58
반응형

안녕하세요. 훈츠입니다. 금일은 가상함수와 추상 클래스에 대해 포스팅 합니다.


가상 기본 클래스 ( virtual base class )

다중 상속에서 기본 클래스가 한번만 생성되게 하기 위한 키워드 'virtual' 입니다. 

 

※ 형식

  • public B : virtual public A {  }
  • 상속 접근 지정자 앞에 virtual를 붙입니다.

Virtual 선언 했을때

virtual 를 선언 하지 않았을때, 중복으로 생성자가 만들어지는 것을 확인 할수 있습니다.

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
//훈스 블로그---------------------------------------------------------------------------------------------------코드//
class A
{
public:
    A() { cout << "A 생성자 호출" << endl; }
    ~A() { cout << "A 소멸자 호출" << endl; }
};
class B : public A
{
public:
    B() { cout << "B 생성자 호출" << endl; }
    ~B() { cout << "B 소멸자 호출" << endl; }
};
 
class C : public A
{
public:
    C() { cout << "C 생성자 호출" << endl; }
    ~C() { cout << "C 소멸자 호출" << endl; }
};
 
class D : public B, public C
{
public:
    D() { cout << "D 생성자 호출" << endl; }
    ~D() { cout << "D 소멸자 호출" << endl; }
};
 
int main()
{
    D Test;
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

생성자 호출 순서 (A -> B), (A -> C), D
소멸자 호출 순서 D, (C -> A), (B -> A
파생클래스에서 상속하고 있는 A 클래스를 계속해서 생성하는것을 볼수 있습니다. 이는 메모리 낭비로 이어 집니다. 

Virtual 선언 했을때

virtual 를 선언 했을때, 중복으로 생성자가 만들어지지 않는것을 확인 할수 있습니다. 

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
class A
{
public:
    A() { cout << "A 생성자 호출" << endl; }
    ~A() { cout << "A 소멸자 호출" << endl; }
};
class B : virtual public A
{
public:
    B() { cout << "B 생성자 호출" << endl; }
    ~B() { cout << "B 소멸자 호출" << endl; }
};
 
class C :virtual public A
{
public:
    C() { cout << "C 생성자 호출" << endl; }
    ~C() { cout << "C 소멸자 호출" << endl; }
};
 
class D : public B, public C
{
public:
    D() { cout << "D 생성자 호출" << endl; }
    ~D() { cout << "D 소멸자 호출" << endl; }
};
 
int main()
{
    D Test;
    return 0;
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

생성자 호출 순서 A -> B -> C -> D
소멸자 호출 순서 D -> C -> B -> A 
파생클래스에서 상속하고 있는 A 클래스를 한번만 생성하는것을 볼수 있습니다. 

가상 소멸자 

상위 클래스의 포인터를 이용하여, 하위 소멸자를 호출할 수 있도록 상위 클래스의 소멸자에 'virtual' 을 붙입니다.

시스템의 메모리해제를 통해, 메모리 효율을 올릴수 있습니다. 

 

※ 형식

  • virtual ~ A( ) {  }
  • 상위 클래스 소멸자 앞에 virtual를 붙입니다.

Virtual 선언  했을때

virtual 를 선언 하지 않았을때, 메모리 해제가 빠지는것을 확인 할수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
public:
    A() { cout << "A 생성자 호출" << endl; }
     ~A() { cout << "A 소멸자 호출" << endl; }
};
class B : virtual public A
{
public:
    B() { cout << "B 생성자 호출" << endl; }
    ~B() { cout << "B 소멸자 호출" << endl; }
};
 
 
int main()
{
    A* pA = new B;
    delete pA;
    
    return 0;
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

반응형