2015-08-27 24 views
5

Czy zostanie utworzona wirtualna tabela dla klasy pochodnej, która nie ma żadnej funkcji wirtualnej z wyjątkiem klasy nadrzędnej, funkcji wirtualnej, która nie jest nadpisana przez Klasy pochodnej.Tabela wirtualna dla klasy pochodnej, która nie ma żadnej funkcji wirtualnej z wyjątkiem klasy nadrzędnej, funkcja wirtualna

dla ex:

class A{ 
public: 
    virtual void show(); 

}; 

class B : public A 
{ 

}; 

Jak o wirtualnej tabeli klasy B.

+3

Który kompilator? Standardowy C++ nie wie, co to jest vTable. – Quentin

+1

Dlaczego ci na tym zależy? Jaką to robi różnicę? –

+0

Jestem po prostu ciekawy wirtualnego stołu i wszystkich jego przypadków, w których potrzebujemy wirtualnego stołu, aby osiągnąć dynamiczny polimorfizm. –

Odpowiedz

0

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++).

2

Nie ma standardowa odpowiedź na swoje pytanie. To naprawdę zależy od wersji kompilatora. Nie ma standardowego ABI określonego w C++. Jeśli jesteś zainteresowany głębiej, spójrz na "Itanium C++ ABI" lub spróbuj znaleźć odpowiedź na własną rękę, zaglądając do kodu asemblera.

Była nawet propozycja, aby zdefiniować przenośny ABI dla C++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf