[cfe-dev] Microsoft vtordisp field support for clang.
John McCall
rjmccall at apple.com
Tue Feb 14 17:52:59 PST 2012
On Feb 14, 2012, at 3:40 AM, r4start wrote:
> On 14/02/2012 15:34, r4start wrote:
>> On 14/02/2012 05:06, John McCall wrote:
>>> class A { virtual void foo(); } class B : public A { }; class C : public virtual B { C(); virtual void foo(); };
>> For this test we will get next result:
>> class C size(12):
>> +---
>> 0 | {vbptr}
>> +---
>> 4 | (vtordisp for vbase B)
>> +--- (virtual base B)
>> | +--- (base class A)
>> 8 | | {vfptr}
>> | +---
>> +---
>> If somewhere in inheritance path class has declare ctor or dtor and overload virtual method from virtual base,
>> then before virtual base Microsoft compiler push vtordisp in layout.
>>
> Also for this test case:
>
> class A { virtual void foo(){} };
> class B : public A { };
> class C : public virtual B { C(){} virtual void foo(){} };
> class D : public C { int qqq; };
>
> class D size(16):
> +---
> | +--- (base class C)
> 0 | | {vbptr}
> | +---
> 4 | qqq
> +---
> 8 | (vtordisp for vbase B)
> +--- (virtual base B)
> | +--- (base class A)
> 12 | | {vfptr}
> | +---
> +---
> As you can see D also has vtordisp for B.
Okay. I don't think this fundamentally changes the algorithm. I did think of
a case that might matter, though: a superclass might override a method
from a non-virtual base that is *also* a virtual base in some derived class.
That is to say, is there a vtordisp in 'C' in the following code?
class A { virtual void foo(); };
class B: public A { virtual void foo(); B(); };
class C : public B, public virtual A { C(); };
John.
More information about the cfe-dev
mailing list