[COM] [예제] COM Aggregation 에서의 casting
CS/COM 2009. 4. 24. 07:00COM공부중 Aggregation 공부하던중 왠지 casting 부분에서 급 혼란. -_-;
Casting을 하게 되면, Casting된 Object를 Base class부터 생각하고, 이후 그 Object의 Derived class를 생각하자!!! -_-;;;
01 | class IUnknown |
02 | { |
03 | public : |
04 | virtual void QueryInterface() = 0; |
05 | virtual void AddRef() = 0; |
06 | virtual void Release() = 0; |
07 | }; |
08 |
09 | class IDummy : public IUnknown |
10 | { |
11 | public : |
12 | virtual void Fx() = 0; |
13 | }; |
14 |
15 | class INondelegatingUnknown |
16 | { |
17 | public : |
18 | virtual void NondelegatingQueryInterface() = 0; |
19 | virtual void NondelegatingAddRef() = 0; |
20 | virtual void NondelegatingRelease() = 0; |
21 | }; |
22 |
23 | class C : public IDummy, |
24 | public INondelegatingUnknown |
25 | { |
26 | public : |
27 | virtual void QueryInterface() { std::cout << "QueryInterface" << std::endl; } |
28 | virtual void AddRef() { std::cout << "AddRef" << std::endl; } |
29 | virtual void Release() { std::cout << "Release" << std::endl; } |
30 |
31 | virtual void NondelegatingQueryInterface() |
32 | { std::cout << "NondelegatingQueryInterface" << std::endl; } |
33 | virtual void NondelegatingAddRef() |
34 | { std::cout << "NondelegatingAddRef" << std::endl; } |
35 | virtual void NondelegatingRelease() |
36 | { std::cout << "NondelegatingRelease" << std::endl; } |
37 |
38 | virtual void Fx() { std::cout << "Fx()" << std::endl; } |
39 |
40 | C(); |
41 |
42 | public : |
43 | IUnknown* m_pI; |
44 | void Go(); |
45 | }; |
46 |
47 | C::C() |
48 | { |
49 | m_pI = reinterpret_cast <IUnknown*> |
50 | ( static_cast <INondelegatingUnknown*>( this ) ); |
51 | } |
52 |
53 | void C::Go() |
54 | { |
55 | m_pI->QueryInterface(); |
56 | } |
57 |
58 | int _tmain( void ) |
59 | { |
60 | C c; |
61 |
62 | c.Go(); |
63 |
64 | return 0; |
65 | } |
Inside COM Aggregation 예제