В чем смысл clang -Wweak-vtables?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В чем смысл clang -Wweak-vtables?

Сообщение Anonymous »

Я принципиально не понимаю -Wweak-vtables в clang. Вот что я наблюдал на данный момент:

Случай первый: (вызывает предупреждение)

Код: Выделить всё

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

Вопросы:
  • Почему это проблема?
  • Почему это можно исправить, объявив виртуальную функцию? (Предупреждение касается
    определений)
  • Почему предупреждение не появляется, если я не являюсь производным от класса?
  • Почему предупреждение не появляется, если у производного класса нет виртуального деструктора?


Подробнее здесь: https://stackoverflow.com/questions/237 ... ak-vtables
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»