Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per impostazione predefinita, la Creazione guidata controllo ATL genera nuove classi con la macro ATL_NO_VTABLE, come indicato di seguito:
class ATL_NO_VTABLE CProjName
{
...
};
ATL definisce quindi _ATL_NO_VTABLE come segue:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Se non si definiscono _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE si espande fino a declspec(novtable). L'uso declspec(novtable)di in una dichiarazione di classe impedisce l'inizializzazione del puntatore della tabella virtuale nel costruttore e nel distruttore della classe. Quando si compila il progetto, il linker elimina la tabella virtuale e tutte le funzioni a cui punta la tabella virtuale.
È necessario usare ATL_NO_VTABLE e di conseguenza declspec(novtable), con solo le classi di base che non sono direttamente creabili. Non è necessario usare declspec(novtable) con la classe più derivata nel progetto, perché questa classe (in genere CComObject, CComAggObject o CComPolyObject) inizializza il puntatore vtable per il progetto.
Non è necessario chiamare funzioni virtuali dal costruttore di qualsiasi oggetto che usa declspec(novtable). È consigliabile spostare tali chiamate al metodo FinalConstruct .
Se non si è certi che sia necessario usare il declspec(novtable) modificatore, è possibile rimuovere la macro ATL_NO_VTABLE da qualsiasi definizione di classe oppure disabilitarla a livello globale specificando
#define _ATL_DISABLE_NO_VTABLE
in pch.h (stdafx.h in Visual Studio 2017 e versioni precedenti), prima che vengano inclusi tutti gli altri file di intestazione ATL.
Vedi anche
Creazione guidata progetto ATL
Tipi di progetto C++ in Visual Studio
Programmazione con il codice runtime C e ATL
Nozioni fondamentali sugli oggetti COM ATL
novtable
Configurazioni progetto ATL predefinite