반응형
안녕하세요. 훈츠입니다. 금일은 가상함수와 추상 클래스에 대해 포스팅 합니다.
가상 기본 클래스 ( 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
|
//Hoons Blog---https://rain2002kr.tistory.com---------------------------------------------------------------///
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
|
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///
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 |
'컴퓨터 언어 > C++' 카테고리의 다른 글
[C++] C++ 16일차 함수 오버로딩 2 (0) | 2020.04.20 |
---|---|
[C++] C++ 15일차 연산자 오버로딩 (0) | 2020.04.17 |
[C++] C++ 13일차 가상함수와 다형성 (0) | 2020.04.15 |
[C++] C++ 12일차 상속 4 (0) | 2020.04.14 |
[C++] C++ 11일차 상속 3 (0) | 2020.04.13 |