ich weiß, sind hier über vtables viele Fragen gestellt, aber ich bin immer noch ein wenig verwirrt.Sind vtables nur mit einem Zeiger auf Basisklasse verwendet
Verwendet werden vtables nur dann, wenn wir einen Zeiger auf eine Basisklasse aufzurufen, die virtuelle Funktion von abgeleiteten Klassen zu lösen?
In meinem Beispiel unten, in Fall 1, werden zur Laufzeit hier Vtables verwendet, obwohl das Tiger-Objekt nicht dynamisch auf dem Heap/Free Store erstellt wurde?
In Fall 2 werden Vtables verwendet, obwohl der Compiler zur Kompilierzeit weiß, dass wir auf ein Tiger-Objekt zeigen.
Was ist mit Fall 3?
Vielen Dank im Voraus.
#include <iostream>
using namespace std;
class Animal // base class
{
public:
virtual void makeNoise() {cout<<" "<<endl;}
};
class Tiger: public Animal
{
public:
void makeNoise() {cout<<"Tiger Noise"<<endl;}
};
class Elephant: public Animal
{
public:
void makeNoise() {cout<<"Elephant Noise"<<endl;}
};
int main()
{
//case 1
Tiger t1;
Animal* aptr = &t1;
aptr->makeNoise(); // vtables used?
//case 2
Tiger t2;
Tiger* tptr = &t2; //vtables used ?
tptr->makeNoise();
//case 3
Elephant e1; //vtables used ?
e1.makeNoise();
}
Eine Vtable wird verwendet, wenn Sie eine virtuelle Methode über einen übergeordneten Klassenzeiger wie in Fall 1 aufrufen. – user2061057
@ user2061057 ... oder übergeordnete Klassenreferenz ... –
Es ist Aufgabe des Compilers, eine vtable zu verwenden oder nicht in jedem einzelnen Fall. Wenn der Compiler beweisen kann, was der abgeleitete Typ des Zeigeobjekts ist, ist es völlig in Ordnung, für diesen Aufruf keine Vtable zu verwenden. –