Я в основному не розумію кланг -Wweak-vtables
. Ось те, що я спостерігав до цього часу:
Випадок перший: (викликає попередження)
class A {
public:
virtual ~A(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Випадок другий: (не викликає попередження)
class A {
public:
virtual ~A(){}
};
int main(){}
Випадок третій: (не викликає попередження)
class A {
public:
virtual ~A();
};
A::~A(){}
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Випадок чотири: (Попередження про спрацьовування)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Випадок п'ятий: (не викликає попередження)
class A {
public:
virtual ~A(){}
virtual void fun();
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Випадок шостий: (не викликає попередження)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {};
int main(){}
Випадок сьомий: (не викликає попередження)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual void fun(){}
};
int main(){}
Точне попередження -
warning: 'A' has no out-of-line virtual method definitions; its vtable
will be emitted in every translation unit [-Wweak-vtables]
Очевидно, якщо я не оголошую некласну віртуальну функцію в класі, це спричиняє якусь проблему тоді і лише тоді, коли я походжу від неї, а похідний клас має віртуальний деструктор.
Запитання:
- Чому це проблема?
- Чому це виправляється оголошенням віртуальної функції? (Попередження говорить про визначення)
- Чому попередження не виникає, коли я не походжу з класу?
- Чому попередження не виникає, коли похідний клас не має віртуального деструктора?