#include
using namespace std;
class abc
{
int a;
};
class xyz : public virtual abc
{
int b;
};
int main()
{
abc obj;
xyz obj1;
Virtual bases classes increase (dynamic, runtime) conversion requirements, and I suppose that the size increase are for a kind of 'pivoting ground' to walk the (base) class hierarchy in non-ambiguous ways when doing such conversions.
In less mumbo jumbo, here is a counter example that could show what's going on:
virtual abc
http://ideone.com/h5y7R
sizeof(xyz) == 44
(88 on 64bit arch)abc
http://ideone.com/h5y7R
sizeof(xyz) == 68
(128 (padded) on 64bit arch)
#include
class abc
{
int x;
virtual void t();
};
template struct interm : virtual abc
{
virtual void t();
virtual void s();
};
struct xyz :
/*virtual*/ interm<1>,
/*virtual*/ interm<2>,
/*virtual*/ interm<3>,
/*virtual*/ interm<4>,
/*virtual*/ interm<5>,
/*virtual*/ interm<6>,
/*virtual*/ interm<7>,
/*virtual*/ interm<8>
{
int b;
virtual void t();
virtual void s();
};
int main()
{
std::cout << sizeof(abc) << std::endl;
std::cout << sizeof(interm<1>) << std::endl;
std::cout << sizeof(xyz) << std::endl;
return 0;
}
You'll notice a significant reduction in size when marking the abc
base as virtual (at least on gcc). Also, note no effect when marking (any) of the interm
ediate base classes as (non)virtual.