«Пропавшие не виртуальные громы» и порядок наследования - PullRequest
8 голосов
/ 14 апреля 2011

У нас большая база кода в C ++, и после небольшого рефакторинга (добавлен один класс и переписаны некоторые связанные методы) мы начали получать ошибки компоновщика в GCC 3 и 4. В частности, ошибки компоновщика были «пропущены ссылки на не виртуальные».спасибо »в небольших примерах программ, которые подклассируют классы в нашем большом SDK.

Поиск в Интернете не дал много подсказок, кроме некоторых старых ошибок GCC, которые, похоже, были устранены.

АтрибутыКажется, проблема в следующем:

  • GCC 3.4.6 и 4.3.3, оптимизация с -O2
  • Множественное наследование, включая случайное виртуальное наследование.
  • ИзменениеПорядок наследования, скажем, от
    class Foo: public A, public B {} до
    class Foo: public B, public A {}
    для классов, в которых отсутствует thunks, "решает" проблему.

Виртуальное наследование появляется тольков одном, очень часто используемом базовом классе для подсчета ссылок.Я убедился, что каждое использование этого класса действительно является виртуальным публичным, а не просто публичным наследованием случайно.

Очевидно, что манипулирование с порядком наследования не решает проблему на самом деле.Что еще это может быть?

Ответы [ 2 ]

1 голос
/ 29 октября 2012

Если изменение порядка объявления базовых классов решает проблему, это, вероятно, означает, что один из базовых классов не определяет должным образом то, что он объявил.

Например, если у вас есть объявление с (не виртуальным) методом Func в классе A и то же самое в классе B, но вы никогда не определяли его для класса A, то при первом вызове метода у вашего ребенка, называется версия класса А., но во время ссылки ссылка не найдена. Если вы измените порядок наследования, вместо этого вызовет компилятор B :: Func, который определен, и компоновщик найдет его.

ИМХО, в любом случае это плохой дизайн, так как поведение будет трудно предсказать и отладить.

0 голосов
/ 16 октября 2012

Это может быть проблема алмаз

если да, проверьте это нить

...