Есть иерархия классов
Код
class TNonVirtual // нет виртуальных функций
{
int a, b;
public:
void f1(int c) {a = c;}
void f2(int c) {b = c;}
};
struct IInterf // только чисто виртуальные ф-ции
{
virtual void vf1() = 0;
};
class TUnion : public TNonVirtual, public IInterf
{
// нет данных или методов, нужен чтобы не переделывать имеющийся код
};
class TRes : public TUnion
{
int abc;
public:
void vf1() {abc = 6; }
};
TRes global;
{
int a, b;
public:
void f1(int c) {a = c;}
void f2(int c) {b = c;}
};
struct IInterf // только чисто виртуальные ф-ции
{
virtual void vf1() = 0;
};
class TUnion : public TNonVirtual, public IInterf
{
// нет данных или методов, нужен чтобы не переделывать имеющийся код
};
class TRes : public TUnion
{
int abc;
public:
void vf1() {abc = 6; }
};
TRes global;
Размер global - 10 байт. Смотрю в AVR studio:
Код
global
TUnion
TNonVirtual
a
b
IInterf
__vptr
abc
__vptr
TUnion
TNonVirtual
a
b
IInterf
__vptr
abc
__vptr
Вопрос: А зачем нужна TRes::__vptr, если внутри TRes нет своих виртуальных ф-ций, а только реализации ф-ций IInterf?
Причем если переписать так:
class TUnion : public IInterf, public TNonVirtual - т.е. поставить сначала наследование от интерфейса, а потом - от класса без виртуальных ф-ций, то TRes::__vptr исчезает и размер global становится 8 байт.
Странно как-то...