В основном я не понимаю clang -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]
Таким образом, очевидно, что если я не объявляю не-встроенную виртуальную функцию в классе, это вызывает некоторые вид проблемы тогда и только тогда, когда я получаю ее, а производный класс имеет виртуальный деструктор.
Вопросы:
- Почему это проблема?
- Почему это фиксируется путем объявления виртуальной функции? (Предупреждение говорит о определения)
- Почему предупреждение не возникает, если я не получаю от класса?
- Почему предупреждение не возникает, когда производный класс не имеет виртуального деструктора?