Basically I don't understand clang -Wweak-vtables . Here is what I have observed so far:
Case one: (triggers a warning)
class A { public: virtual ~A(){} }; class B : public A { public: virtual ~B(){} }; int main(){}
Case two: (does not raise a warning)
class A { public: virtual ~A(){} }; int main(){}
Case Three: (does not raise a warning)
class A { public: virtual ~A(); }; A::~A(){} class B : public A { public: virtual ~B(){} }; int main(){}
Case Four: (trigger warning)
class A { public: virtual ~A(){} virtual void fun(){} }; class B : public A { public: virtual ~B(){} }; int main(){}
Case five: (does not raise a warning)
class A { public: virtual ~A(){} virtual void fun(); }; class B : public A { public: virtual ~B(){} }; int main(){}
Case six: (does not raise a warning)
class A { public: virtual ~A(){} virtual void fun(){} }; class B : public A {}; int main(){}
Case seven: (does not raise a warning)
class A { public: virtual ~A(){} virtual void fun(){} }; class B : public A { public: virtual void fun(){} }; int main(){}
Accurate warning
warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Thus, it is obvious that if I do not declare a non-built-in virtual function in the class, this causes some kind of problem if and only if I get it, and the derived class has a virtual destructor.
Questions:
- Why is this a problem?
- Why is this fixed by declaring a virtual function? (A warning speaks of a definition)
- Why does the warning not occur if I do not receive from the class?
- Why does the warning not occur when the derived class does not have a virtual destructor?
c ++ clang
Baum mit Augen May 19 '14 at 20:48 2014-05-19 20:48
source share