Można to sprawdzić patrząc na zawartość obiektu. Napisałem prosty program, który drukuje zawartość klasy bazowej, klasę, uzyskaną klasę, która jest taka sama jak klasa bazowej, ale w normalnym sposobie zamiast wirtualne:
#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
wynikiem działania powyższego programu po kompilacji go cpp.sh (nie jestem pewien, co kompilator nie używany):
Base: 0x4013e0 0x0
Derived: 0x401400 0x0
NonVirtual: 0x0 0x0
, więc spodziewam się, że oznacza to, że rzeczywiście utworzono wirtualną tabelę dla obiektu Derived
(przynajmniej dla tego kompilatora - ponieważ wymagane zachowanie nie jest zdefiniowane w standardzie C++).
Który kompilator? Standardowy C++ nie wie, co to jest vTable. – Quentin
Dlaczego ci na tym zależy? Jaką to robi różnicę? –
Jestem po prostu ciekawy wirtualnego stołu i wszystkich jego przypadków, w których potrzebujemy wirtualnego stołu, aby osiągnąć dynamiczny polimorfizm. –