Question

Below is a pseudo declaration for a multilevel inheritance. Edit: Compiler VS C++

Base class ( protected int data)

derived1 : virtual public base ( protected int data1 )

derived2 : virtual public base ( protected int data2)

derived3 : derived1,derived2 ( private int data3 )

Main(){ base b;    derived1 d1;   derived2 d2;   derived3 d3; }

    sizeof(b) // 4 which is correct as only int (4bytes)
    sizeof(d1) // 12 why not 8 -> 4(base) + 4(derived)
    sizeof(d2) // ??? whatever applies above should apply here
    sizeof(d3) // 24 why not 12 -> 4(base) + 4(derived1/derived2) + 4(d3).

Does size also include virtual tables also. Again here there cannot be virtual table as no virtual function defined. Please help in clarifying my doubt.

PS: What I have understood till now:

Unless the function is declared virtual in base class,

base *bptr;
 derived d;
 bptr = &d;
 bptr->fun();  // will call the base class function.

But if the fun() is declared virtual then the above code will call derived class fun().

Was it helpful?

Solution

A C++ compiler is allowed to add as much padding or extra data as it wants, and frequently will to align memory for optimal RAM access. Never assume anything about the size of an object, except that it will be >= to the size of its parts. Here it probably added the extra 4 bytes to align to an 8 byte boundary so it can be aligned to a 64 bit register.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top