spojrzeć na następujące C++ kodC++ wirtualny układ tabeli MI (wielokrotne dziedziczenie)
class Base1 {
public:
Base1();
virtual ~Base1();
virtual void speakClearly();
virtual Base1 *clone() const;
protected:
float data_Base1;
};
class Base2 {
public:
Base2();
virtual ~Base2();
virtual void mumble();
virtual Base2 *clone() const;
protected:
float data_Base2;
};
class Derived : public Base1, public Base2 {
public:
Derived();
virtual ~Derived();
virtual Derived *clone() const;
protected:
float data_Derived;
};
"wnętrze C++ Object Model" 4,2 mówi, że wirtualny układ tabeli klasy Bazowa1, Base2 i pochodny jest jak to:
Moje pytanie brzmi:
wirtualna tabeli SubObject Base1 klasy Derived zawiera Base2::mumble
. Dlaczego? Wiem, że wiem, że klasa Derived udostępniła ten wirtualny stół z Base1, więc myślę, że funkcja Base2 nie powinna się tutaj pojawiać. Czy ktoś mógłby mi powiedzieć, dlaczego? Dzięki.
Nie zaszkodzi dodać dodatkowe wpisy do tabeli "Pochodna" po tabelach 'Base1'. Można to zrobić dla zwiększenia wydajności. Biorąc pod uwagę wskaźnik 'Derived *', tańsze jest wywoływanie funkcji wirtualnych za pomocą vtable 'Base1' /' Derived' niż za pomocą vtable 'Base2'. –
Uwaga: sposób prezentowania rzeczy wydaje się być zawalony, w Itanium ABI człon '_vptr' jest w rzeczywistości ** pierwszy **; a także 'Base1' jest ** pierwszym ** elementem' Derived'. –
@ MatthieuM. We wszystkich kompilatorach, jakie widziałem, element '_vptr' (pseudo-) był pierwszą rzeczą w klasie, ale standard oczywiście pozwala na to w dowolnym miejscu. –