Per quanto riguarda le domande precedenti su questo argomento:Clang -Wweak-VTables e pura classe astratta
Questo è un follow-up della domanda che ho chiesto di recente: clang: no out-of-line virtual method definitions (pure abstract C++ class) , e che è stato contrassegnato come duplicato di questa domanda: What is the meaning of clang's -Wweak-vtables?. Non penso che questo abbia risposto alla mia domanda, quindi qui mi concentro sulla cosa che mi imbarazza e che non ha ancora ricevuto risposta.
mio scenario:
Sto cercando di compilare il codice seguente semplice C++ usando Clang-3.5:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc
#include "test.h"
A::A() {;}
A::~A() {;}
Il comando che utilizzo per compilarlo (Li nux, uname -r: 3.16.0-4-amd64):
$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc
E l'errore che ottengo:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Il codice di cui sopra si basa bene quando la classe A non è puro astratto. Il seguente codice non emette avvisi, e l'unico cambiamento è che la classe A non è più astratto:
test2.h:
class A
{
public:
A();
virtual ~A();
};
test2.cc
#include "test2.h"
A::A() {;}
A::~A() {;}
La mia domanda
Cosa c'è di così speciale in classi astratte pure che il codice precedente attiva rongi a Clang?
Nel tuo secondo esempio, 'A' non è affatto astratto –
Cosa pensi che succederebbe se non avessi definizione di A :: ~ A'? Quindi, se il compilatore attendesse di vedere una definizione di 'A :: ~ A' per emettere il vtable, non ci sarebbe alcun vtable! – immibis
@immibis che comportamento corretto non è vero? (altri TU compresi test2.h arriveranno alla stessa conclusione) –