Si può controllare, cercando in contenuti dell'oggetto. Ho scritto questo semplice programma che consente di stampare il contenuto della classe base, classe derivata e una classe che è la stessa della classe base, ma con un metodo normale, invece di quella virtuale:
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
class Base {
public:
virtual void show() {}
};
class Derived : public Base
{ };
class NonVirtual {
public:
void show() {}
};
struct Test
{
int data1, data2;
};
template <typename T>
void showContents(T* obj, string name)
{
Test* test = new Test{};
test = reinterpret_cast<Test*>(obj);
cout << name << ": " << hex << "0x" << test->data1 << " " << "0x" << test->data2 << endl;
delete test;
}
int main()
{
Base* base = new Base{};
Derived* derived = new Derived{};
NonVirtual* nonVirtual = new NonVirtual{};
showContents(base, "Base");
showContents(derived, "Derived");
showContents(nonVirtual, "NonVirtual");
delete base;
delete derived;
delete nonVirtual;
}
Live demo
il risultato dell'esecuzione del programma di cui sopra dopo la compilazione con cpp.sh (io non sono sicuro di quello che il compilatore viene utilizzato lì):
Base: 0x4013e0 0x0
Derived: 0x401400 0x0
NonVirtual: 0x0 0x0
quindi mi aspetto che ciò significhi che è stata creata una tabella virtuale per l'oggetto Derived
(almeno per questo compilatore, poiché il comportamento richiesto non è definito nello standard C++).
Quale compilatore? Il C++ standard non sa cosa sia un vTable. – Quentin
Perché ti importa di questo? Che differenza fa? –
Sono solo curioso del tavolo virtuale e di tutti i suoi casi in cui abbiamo bisogno della tabella virtuale per ottenere un polimorfismo dinamico. –