Grundsätzlich verstehe ich Clangs nicht -Wweak-vtables
. Folgendes habe ich bisher beobachtet:
Fall eins: (löst die Warnung aus)
class A {
public:
virtual ~A(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Fall zwei: (löst keine Warnung aus)
class A {
public:
virtual ~A(){}
};
int main(){}
Fall drei: (Löst keine Warnung aus)
class A {
public:
virtual ~A();
};
A::~A(){}
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Fall vier: (löst eine Warnung aus)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Fall fünf: (Löst keine Warnung aus)
class A {
public:
virtual ~A(){}
virtual void fun();
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Fall 6: (Löst keine Warnung aus)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {};
int main(){}
Fall sieben: (Löst keine Warnung aus)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual void fun(){}
};
int main(){}
Die genaue Warnung ist
warning: 'A' has no out-of-line virtual method definitions; its vtable
will be emitted in every translation unit [-Wweak-vtables]
Wenn ich also anscheinend keine virtuelle Inline-Funktion in einer Klasse deklariere, verursacht dies genau dann ein Problem, wenn ich davon abgeleitet bin und die abgeleitete Klasse einen virtuellen Destruktor hat.
Fragen:
- Warum ist das ein Problem?
- Warum wird dies durch Deklarieren einer virtuellen Funktion behoben? (Warnung spricht von Definitionen)
- Warum tritt die Warnung nicht auf, wenn ich nicht von der Klasse abgeleitet bin?
- Warum tritt die Warnung nicht auf, wenn die abgeleitete Klasse keinen virtuellen Destruktor hat?
B
sollte virtuell sein (da der Destruktor der Basisklasse deklariert wurdevirtual
).~B()
keine Standardeinstellungen verwendet oder explizit verwendet , daher wird die Standarddefinition vom Compiler nicht implizit instanziiert. Wie kann es virtuell sein, wenn es nicht existiert? Die Trivialität der Beispiele verursacht einige kontraintuitive Effekte.