Im Hinblick auf frühere Anfragen zu diesem Thema:Clang -Wweak-vtables und rein abstrakte Klasse
Dies ist ein aus der Frage folgen, die ich habe vor kurzem gefragt: clang: no out-of-line virtual method definitions (pure abstract C++ class) und die als Duplikat markiert wurde dieser Frage: What is the meaning of clang's -Wweak-vtables?. Ich glaube nicht, dass das meine Frage beantwortet hat, also konzentriere ich mich auf das, was mich verwirrt und das noch nicht beantwortet wurde.
Mein Szenario:
Ich versuche, den folgenden einfachen C++ Code mit Clang-3.5 zu kompilieren:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc
#include "test.h"
A::A() {;}
A::~A() {;}
Der Befehl, den ich für die Kompilierung verwende (Li Nux, uname -r: 3.16.0-4-amd64):
$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc
Und die Fehler, die ich bekomme:
./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]
Der obige Code fein baut, wenn der Klasse A nicht rein abstrakt ist. Der folgende Code erzeugt keine Warnungen, und die einzige Änderung ist, dass die Klasse A ist nicht mehr abstrakt:
test2.h:
class A
{
public:
A();
virtual ~A();
};
test2.cc
#include "test2.h"
A::A() {;}
A::~A() {;}
Meine Frage
Was ist das Besondere an reinen abstrakten Klassen, dass der obige Code wa auslöst in Clang?
In Ihrem zweiten Beispiel ist 'A' überhaupt nicht abstrakt –
Was denken Sie würde passieren, wenn Sie keine Definition von' A :: ~ A' hätten? Wenn dann der Compiler darauf wartet, eine Definition von'A: ~ A zu sehen, um die VTable zu emittieren, würde es keine VTable geben! – immibis
@immibis das ist richtiges Verhalten, nicht wahr? (andere TUs einschließlich test2.h werden zur gleichen Schlussfolgerung kommen) –