Случай первый: (вызывает предупреждение)
Код: Выделить всё
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
Мобильная версия