티스토리 뷰
728x90
객체 생성 및 소멸 과정 중, 절대로 가상 함수를 호출하지 말자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Transaction
{
public:
Transaction()
{
logTransaction();
}
virtual void logTransaction() const=0;
};
class butTransaction: public Transaction
{
public:
butTransaction(){};
virtual void logTransaction() const;
};
void mian()
{
BuyTransaction b;
}
|
cs |
상속 관계에서 생성자에 쓰이는 virtual 키워드의 사용시 주의 사항
Transaction 생성자의 마지막 줄을 보면 가상 함수인 logTransaction을 호출하는 문장이 보이는
부모 클래스에서 순수 가상 함수로 virtual 을 처리해 줘도 이것은 아직 파생클래스가 생성 되기 이전이기 때문에 곳 자신의 함수를 호출하게 됩니다.
이유 : 가상 함수는 절대로 기본클래스의 생성자가(자식클래스)가 호출될 동안은 절대 자식 클래스 쪽으로 내려가지 않습니다. 그 대신 객체 자신이 기본 클래스 타입인 것처럼 동작합니다.
예제 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#include <iostream>
using namespace std;
class AAA
{
public:
AAA(char *_pstr)
: m_pstr1(null)
{
m_pstr1 = new char[strlen(_pstr)+1];
strcpy(m_pstr1,_str1);
}
/*virtual*/
~AAA()
{
cout << "~AAA() 소멸자" <<endl;
if( null != m_pstr1 )
{
delete [] m_pstr1;
m_pstr1 = null;
}
}
virtual void Showstring()
{
if( null != m_pstr1 )
{
cout << m_pstr1 <<endl;
return;
}
cout << " m_pstr1 Error " <<endl;
}
private:
char * m_pstr1;
};
class BBB : public AAA
{
private:
char * m_pstr2;
public:
BBB(char *_pstr1, char *_pstr2)
:AAA(_pstr1)
,m_pstr2(null)
{
m_pstr2 = new char[strlen(_pstr2)+1];
strcpy(m_pstr2,_pstr2);
}
~BBB()
{
cout<<"~BBB() 소멸자"<<endl;
if( null != m_pstr2)
{
delete [] m_pstr2;
m_pstr2= null;
}
}
virtual void Showstring()
{
AAA::Showstring();
if( null != m_pstr2 )
{
cout << m_pstr2 <<endl;
return;
}
cout << " m_pstr2 Error " <<endl;
}
};
void main()
{
AAA* pA = new BBB("Good","evening");
BBB* pB = new BBB("Good","morning");
pA->Showstring();
pB->Showstring();
cout<<"------------객체 소멸 직전---------"<<endl;
delete pA ;
delete pB ;
}
|
cs |
이번 예제에서는 소멸자시에 업캐스팅에 의해서 *a의 반영범위가 부모 클래스의 부분에 제한이 됨으로 자식 소멸에의 호출이 이루어지지 않는다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C#.NET
- 서귀포
- 현포다이브
- 울릉도
- 성산블루버블
- C
- 외돌개
- 스쿠버다이빙
- Build
- 네트워크 정보
- 패턴
- script
- 블루버블다이빙팀
- 암호화
- 블루버블다이브팀
- C# 고급 기술
- Linux
- PowerShell
- 서귀포블루버블
- C#
- 제주도
- DLL
- CMake
- OpenSource
- Windows
- 블루버블
- effective
- Effective c++
- 스쿠버 다이빙
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
250x250