Привожу кусок кода из файла $QTDIR/src/corelib/codecs/qtextcodec.h
class Q_CORE_EXPORT QTextCodec
{
Q_DISABLE_COPY(QTextCodec)
public:
...
QString toUnicode(const char *in, int length, ConverterState *state = 0) const
{ return convertToUnicode(in, length, state); }
QByteArray fromUnicode(const QChar *in, int length, ConverterState *state = 0) const
{ return convertFromUnicode(in, length, state); }
// ### Qt 5: merge these functions.
QTextDecoder* makeDecoder() const;
QTextDecoder* makeDecoder(ConversionFlags flags) const;
QTextEncoder* makeEncoder() const;
QTextEncoder* makeEncoder(ConversionFlags flags) const;
virtual QByteArray name() const = 0;
virtual QList<QByteArray> aliases() const;
virtual int mibEnum() const = 0;
protected:
virtual QString convertToUnicode(const char *in, int length, ConverterState *state) const = 0;
virtual QByteArray convertFromUnicode(const QChar *in, int length, ConverterState *state) const = 0;
Смотрим на метод toUnicode(всё аналогично для fromUnicode). Он вызывает convertToUnicode(это метод из секции protected?). Он виртуальный и абстрактный? Но класс-то не виртуальный, я могу создавать его экземпляры и вызывать этот метод toUnicode свободно. WTF? Как это вообще скомпилировалось? Я забыл азы ООП или чего не знаю?
Собственно как я вышел на этот файл. Ковырял свою программу(точнее один тест для неё), в тесте случился segmentation fault. Повторил - не повторяется. Повторил ещё раз - не падает. Хорошо, у меня настроено делать core dump. Беру gdb, смотрю core dump. И вижу это место в backtrace. Нутром чую, что здесь какое-то нехорошее место и должно падать при вызове абстрактного метода. Один раз собственно и упало.