2015-08-27 20 views
5

Viene creata la tabella virtuale per la classe derivata che non ha alcuna funzione virtuale eccetto la classe genitore una funzione virtuale che non è sovrascritta da classe derivata.Tabella virtuale per la classe derivata che non ha alcuna funzione virtuale eccetto la classe genitore una funzione virtuale

es:

class A{ 
public: 
    virtual void show(); 

}; 

class B : public A 
{ 

}; 

Come circa la tabella virtuale di classe B.

+3

Quale compilatore? Il C++ standard non sa cosa sia un vTable. – Quentin

+1

Perché ti importa di questo? Che differenza fa? –

+0

Sono solo curioso del tavolo virtuale e di tutti i suoi casi in cui abbiamo bisogno della tabella virtuale per ottenere un polimorfismo dinamico. –

risposta

0

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

2

Non esiste una risposta standard per la tua domanda. Dipende davvero dalla versione del compilatore. Non c'è ABI standard specificato in C++. Se sei interessato più a fondo, dai un'occhiata a "Itanium C++ ABI" o prova a trovare la risposta da solo guardando nel codice asembler.

c'era anche una proposta per definire portatile ABI per C++

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

Problemi correlati