PRB: Compiler Doesn't Lay Out Overloaded Functions in Order (131104)
The information in this article applies to:
- Microsoft OLE Libraries for Windows and Win32s 2.03
- Microsoft OLE Libraries, when used with:
- the operating system: Microsoft Windows NT 3.5
- Microsoft Visual C++ for Windows, 16-bit edition 1.52, when used with:
- the operating system: Microsoft Windows NT
- Microsoft Visual C++, 32-bit Professional Edition 2.1
This article was previously published under Q131104 SYMPTOMS
The Microsoft Visual C++ compiler does not lay out overloaded functions in
the vtable in the order in which they are declared. This does not adhere to
the COM binary standard. (See the OLE Specification section 3.1.1.1 for a
discussion of the COM binary standard.) If there are no overloaded
functions, the COM binary standard is followed.
In general, it is not a good idea to use overloaded methods in a COM
interface because this precludes use of the interface from languages like C
that do not support overloading.
CAUSE
All the overloads of a function are laid out together in successive entries
in the reverse order of their declaration, overall in the order of the
first overload of each name. Therefore given this declaration:
class A {
virtual void a();
virtual void b();
virtual void a(int);
virtual void b(int);
};
Entries in the vtable are laid out in this order: A::a(int), A::a(),
A::b(int), A::b(). The COM binary standard requires that functions be laid
out in the order in which they are declared.
STATUS
This behavior is built into the design. It cannot be modified because of
legacy code that depends on this behavior.
Modification Type: | Major | Last Reviewed: | 12/3/2003 |
---|
Keywords: | kbprb kbProgramming KB131104 |
---|
|