I\'ve got this trivial class hierarchy:
class Base {
public:
virtual int x( ) const = 0;
};
class Derived : public Base {
int _x;
public:
Derive
Let's go down the line
Virtual table is corrupted.
The virtual table is stuck right after the allocated memory. when you new
a class, the generated code will properly set up the vtable. However, malloc will not properly initialize the vtable
To see the virtual table, run g++ -fdump-class-hierarchy
Vtable for Derived
Derived::_ZTV7Derived: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI7Derived)
16 Derived::x
Class Derived
size=16 align=8
base size=12 base align=8
Derived (0x10209fc40) 0
vptr=((& Derived::_ZTV7Derived) + 16u) <-- notice how this is part of the structure
Base (0x10209fcb0) 0 nearly-empty
primary-for Derived (0x10209fc40)
For a similar reason, without overloading operator=, the generated assembly code will only copy the data and not the vtable [again, the compiler only knows to copy the data, not the vtable]
If you want to see a pointer-based version with a valid vtable function:
Derived e(123);
d = &e;
If you are using virtual functions, then yes, even for non-polymorphic types
Alignment is not an issue.