|
Thanks CPallini,
I have some further thinking. The interface pointers, like pI, pI1, pI2, ... , may be pointed to different instances of object, right?
Here is a sample. Suppose there are 4 object instances of type IX, pointed by pIX1, pIX2, pIX3 and pIX4 repectively. And we have a temporary pointer called pIXTmp. Also suppose at the beginning pIXTmp is NULL;
1. When assigning pIXTmp = pIX1, pIXTmp is pointed to the 1st instance of object;
2. When assigning pIXTmp = pIX2, we need to call Release at first, pIXTmp -> Release() to decrease the reference counter for the 1st object instance, and call pIXTmp -> AddRef() to increase reference conuter to the 2nd object. You can see AddRef and Release are working on different object instance.
Is my understanding correct? Previously, I have not thought of the case when interfaces pointed to different object instances.
regards,
George
|
|
|
|
|
Oh George, we're coming back to OOP basics: by definition a method acts on this object (i.e. on pointed instances in your example)!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
I think you agree with my above statements about interfaces pointing to different object instances, right?
regards,
George
|
|
|
|
|
Do you really need comfort about?
My answer was and is yes.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
My question is answered.
regards,
George
|
|
|
|
|
Hello everyone,
In the book "Inside COM", there is an interesting code segment like this,
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast <ix*> (new CA);
pI -> AddRef();
return pI;
}
</ix*>
My question is, why static_cast <ix*> to result in IUnknown*? Why not static_cast <iunknown*> to result in IUnknown* to be more straightforward (even if I think using IX* and IUnknown* have the same effect)? Are there any reasons or advantages if we use IX* other than IUnknown*?
thanks in advance,
George
|
|
|
|
|
George_George wrote: My question is, why static_cast to result in IUnknown*? Why not static_cast to result in IUnknown* to be more straightforward (even if I think using IX* and IUnknown* have the same effect)? Are there any reasons or advantages if we use IX* other than IUnknown*?
Sorry, but I'm not able to understand the above sentences.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Hi CPallini,
My question is, can I use
IUnknown* pI = static_cast <IUknown*> (new CA);
other than
IUnknown* pI = static_cast <IX*> (new CA);
regards,
George
|
|
|
|
|
Probably you have some issue on formatting code. However, IMHO, yes and probably is more coherent.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Hi CPallini,
I have correctly posted my code. Could you review and comment again?
regards,
George
|
|
|
|
|
My comment is the same:
IMHO, yes (i.e. you can use IUnknown* pI = static_cast <IUknown*> (new CA)) and probably is more coherent.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Hi CPallini,
You are wrong.
It can not compile. Here is similar code segment to reproduce this issue. Do you know why there is compile error?
class Base {
public:
int foo() {cout << "Base" << endl;}
};
class Derived1: public Base
{
public:
int foo() {cout << "Derived1" << endl;}
};
class Derived2: public Base
{
public:
int foo() {cout << "Derived2" << endl;}
};
class Final: public Derived1, public Derived2 {
public:
int foo() {cout << "Final" << endl;}
};
int main()
{
Final f;
Base* pb = &f;
return 0;
}
regards,
George
|
|
|
|
|
OK, It seems I missed the diamod issue of multiple inheritance.
BTW you can simply fix it choosing a derivation path, for instance:
Base* pb = (Derived1 *)&f;
hence my suggestion, on the OP becomes
IUnknown* pI = static_cast<iunknown*>(static_cast <ix*> (new CA));
</ix*></iunknown*>
Weird, I know, but descriptive.
BTW diamond inheritance scheme is evil and should be avoided.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
I am confused why there is ambiguity issue. In my knowledge, class instance is different by the data members, but common (share) in executable code.
In my sample, IUnknown, IX and IY are all classes which do not have data members, they should share the common executable code. Could you explain in more details why compiler complaint ambiguity issue and what blocks compiler from type conversion?
regards,
George
|
|
|
|
|
Since C++ hasn't special syntax for interfaces, I think the compiler isn't allowed to make special assumptions on them. I mean the compiler probably behaves as it was dealing with standard classes (that can have data members), hence finds ambiguities on derivation path.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Hi CPallini,
We can discuss in the situation of class other than interface.
Ambiguity means more than one different values could be selected. The different values in class is data members, not functions.
You can see there is no data members in IUnknown, IX and IY. Why there is ambiguity (I am not sure whether I have made myself understood about why in my context there is ambiguity)? I think the ambiguity occurs because of the data members are different.
regards,
George
|
|
|
|
|
George_George wrote: We can discuss in the situation of class other than interface.
Actually the OOP term to designate a C++ abstract class is interface .
George_George wrote: Ambiguity means more than one different values could be selected. The different values in class is data members, not functions.
I know that. But, as I suggested before, since C++ syntax has no special syntax to designate interfaces (i.e. abstract classes) then probably the compiler cannot make assumptions on them and remains stuck to the more general case, thus finding (inexisting) ambiguities on the derivation path.
However, there is another reason I missed before: suppose, for instance, both IX and IY classes override one IUnknown member, say AddRef , due to polymorphism, how can the compiler resolve between IX::AddRef or IY::AddRef if it cannot make assumptions on the abstract nature of IX and IY classes?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks for your great reply, CPallini!
1.
CPallini wrote: know that. But, as I suggested before, since C++ syntax has no special syntax to designate interfaces (i.e. abstract classes) then probably the compiler cannot make assumptions on them and remains stuck to the more general case, thus finding (inexisting) ambiguities on the derivation path.
No matter whether they contain data member, right?
2.
CPallini wrote: how can the compiler resolve between IX::AddRef or IY::AddRef if it cannot make assumptions on the abstract nature of IX and IY classes?
I do not quite understand your statement above. Could you show some pseudo code please?
regards,
George
|
|
|
|
|
George_George wrote: No matter whether they contain data member, right?
Yes, if compiler cannot exploit abstract nature of classes.
George_George wrote: I do not quite understand your statement above. Could you show some pseudo code please?
Yes, suppose (the example is naive, but you'll probably get the idea):
class IX: public IUnknown
{
...
virtual ULONG AddRef(){ return ++m_nRef;}
...
};
class IY: public IUnknown
{
...
virtual ULONG AddRef(){ return 1;}
...
};
void main()
{
IUnknown *pUnk = new CA;
int n = pUnk->AddRef();
}
what will be (if the above code compiles) n value?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
I think I have got your ideas.
You mean even if IUnknown *pUnk = new CA; can compile, then the statement int n = pUnk->AddRef(); will give ambiguity result -- call AddRef of IX or call AddRef of IY? My understanding correct?
regards,
George
|
|
|
|
|
No, I mean that the sample does NOT compile because of the (call AddRef of IX or call AddRef of IY ) ambiguity, i.e. the compiler prevents such weirdness.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
My question is answered. You are so knowledgeable.
regards,
George
|
|
|
|
|
George_George wrote: My question is answered. You are so knowledgeable.
Thanks , but it isn't true. There is a lot of people far more knowledgeable than me here at CP .
Anyway, thank you again.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Last December I installed VC2008 Enterprise Edition on one of the Laptops. It clobbered my VC version 5 (VC 97) edition, all Online VC 97 Helpfiles became Unavailable. I decided that Managed Code is not for me, I prefer MFC, particularly because of the Code Base I have developped. I know that VC 97 is not really supported anymore, but for me it worked, and I decided to stay with it, at least untill I can afford an Upgrade.
I Uninstalled VC2008, and even re-installed VC 97. Still No Helpfiles. Anyone seen this before?
Regards,
Bram van Kampen
|
|
|
|
|
I need help with the code for making an mdiform transparent
tony-yeyo
|
|
|
|
|