O
die größe der Klasse ist unwichtig. Das einzige was wichtig ist, ist die tiefe der Vererbungshierarchie, weil sich damit die methodpointer ändern, und das unabhängig davon, ob die methode auf die der methodpointer zeigt virtual ist, oder nicht.
//edit nur zur verdeutlichung des problems:
struct Base{
virtual void foo()=0;
void bar(){}
};
struct Derived{
void foo(){}
};
typedef void(Base::*)() mp;
//in der main
Base* a=new Derived;
mp b=&foo;
mp c=&bar;
(a.*b)();
(a.*c)();
das compiled, aber da foo im gegensatz zu bar virtual ist, muss sich der methodpointer anders verhalten,dh er braucht die vtable. würden b und c aber unterschiedlich groß sein, könnte man sie nicht in einen vector packen, dh beide müssen gleich groß sein, und somit muss c sich der größe von b anpassen, die natürlich bekannt sein muss(bzw sollte, der standard erlaubt es auch, wies optimizer genutzt hat).
hier ein text dazu:
http://www.codeproject.com/cpp/FastDelegate.asp
ein kurzer abschnitt:
There's another interesting rule in the standard: you can declare a member function pointer before the class has been defined. This has some unexpected side-effects on some compilers, which I'll discuss later. It's better to avoid this if you can.