In teoria, il compilatore può definire le classi di base in modo diverso. C++ 03 § 10 paragrafo 5 dice:
Un sottooggetto di classe base potrebbe avere un layout (3.7) diverso dal layout di un oggetto più derivato dello stesso tipo.
Come StackedCrooked mentioned, questo potrebbe accadere dal compilatore aggiungendo padding alla fine della classe base A
quando esiste come il proprio oggetto, ma il compilatore non potrebbe aggiungere che padding quando si tratta di una classe di base. Ciò farebbe sì che A::clear()
sovrascriva i primi byte dei membri della sottoclasse.
Tuttavia, in pratica, non sono stato in grado di ottenere questo accada sia con GCC o Visual Studio 2008. Usando questo test:
struct A
{
void clear() { memset(this, 0, sizeof(A)); }
int age;
char type;
};
struct B : public A
{
char x;
};
int main(void)
{
B b;
printf("%d %d %d\n", sizeof(A), sizeof(B), ((char*)&b.x - (char*)&b));
b.x = 3;
b.clear();
printf("%d\n", b.x);
return 0;
}
E la modifica A
, B
, o entrambi per essere 'confezionato' (con #pragma pack
in VS e __attribute__((packed))
in GCC), non è stato possibile ottenere in qualsiasi caso lo b.x
sovrascritto. Le ottimizzazioni sono state abilitate. I 3 valori stampati per le dimensioni/offset erano sempre 8/12/8, 8/9/8 o 5/6/5.
fonte
2011-08-18 21:29:08
Spero che ci forniate la vostra risposta, Johannes. –
@Fred la risposta è già stata data sotto. Quindi non c'è bisogno che io lo "scateni". –