Ich habe viele Beiträge gelesen und jeder sagt, dass virtuelle Tabelle pro Klasse ist, nicht pro Objekt und Objekt hat nur _vtpr Zeiger auf freigegebene vtable. Aber bitte betrachten Sie dieses Beispiel:Virtuelle Tabelle in Polymorphismus
class Base
{
public:
virtual void func1(void) {}
virtual void func2(void) {}
private:
int dummy;
};
class Der1 : public Base
{
public:
virtual void func1(void) {}
private:
int dummy;
};
class Der2 : public Base
{
public:
virtual void func2(void) {}
private:
int dummy;
};
int main(void)
{
Base * obj1 = new Der1;
Base * obj2 = new Der2;
}
Hat obj1 und obj2 betrifft, dass eine einzigartige Basisklasse VTable? Ich glaube die Antwort ist nein, aber kannst du es bitte erklären? Und wenn beide Objekte sich auf dieselbe vtable beziehen, wie wird bestimmt, welche Methoden aufgerufen werden sollen? Zum Beispiel unterscheidet sich obj1-> func1 reference von obj2-> func1.
UPDATE:
welche Operationen ausgeführt werden, wenn Base * obj1 = new Der1;
tun? Kann jemand einen Pseudocode für diese Aktionen schreiben?
vtable ist nicht im C++ - Standard definiert. Es bedeutet, dass Compiler-Implementierer frei tun können, was sie wollen. Es gibt sogar keine Garantie, dass überhaupt eine VTable vorhanden sein wird. Dies ist einer der Hauptgründe, warum wir keinen C++ ABI haben. Sag das an "alle", die "sagen". – Drop
Vermutlich haben 'Der1' und' Der2' jeweils eine eigene vtable, nicht? –
Bitte überprüfen Sie diese [Antwort] (http://stackoverflow.com/a/562240/2352671) von [Johannes Schaub - litb] (http://stackoverflow.com/users/34509/johannes-schau-litb) – 101010