У ITracer также есть виртуальный деструктор.
У меня есть производный класс NullTracer, который реализует logMessage.У меня есть класс TestClass, конструктор которого опционально принимает константную ссылку ITracer. Если ITracer не указан, создается экземпляр NullTracer.
TestClass имеет метод test, который вызывает logMessage своего ITracer.
В GCC 11.2 «вызывается чисто виртуальный метод» генерируется, и на стандартный вывод выводится «привет».
В GCC 11.2 и -O2 исключения не выдаются, и на стандартный вывод выводятся как «привет», так и «тест».
Во-первых, в неоптимизированном случае, что я делаю не так? Я не понимаю, какие чисто виртуальные функции я вызываю, у NullTracer явно есть реализация.
Во-вторых, в оптимизированном случае, почему больше нет исключения и почему оно выполняется так, как Я этого ожидаю?
Редактировать: не могу поверить, что пропустил висящую ссылку. Спасибо
Код: Выделить всё
#include
class ITracer {
public:
virtual ~ITracer() = default;
virtual void logMessage() const = 0;
};
class NullTracer : public ITracer {
public:
void logMessage() const override { std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/71289454/gcc-throws-pure-virtual-method-called-but-not-when-optimizations-are-on[/url]