Это правильное использование dynamic_cast? - PullRequest
0 голосов
/ 19 ноября 2009

У меня есть три класса: Общий, CFG и Оценщик.

Вот общий:

class Generic: public virtual Evaluator, public CFG, public LCDInterface {

Вот CFG:

class CFG : public virtual Evaluator {

И подклассы Evaluator ничего.

Я предоставляю DLL с именем PluginLCD, и в ней есть метод с именем Connect:

void PluginLCD::Connect(Evaluator *visitor) {
    visitor_ = dynamic_cast<Generic *>(visitor);
    if(!visitor_)
        return;
    type_ = visitor_->GetType();
}

Вот как я собираю DLL с помощью scons:

env.SharedLibrary(['PluginLCD.cpp', 'Evaluator.cpp', 'Generic.cpp', 'CFG.cpp'])

Теперь в моем коде есть два сценария. Один находится в классе LCDControl, который подклассы CFG. Другой сценарий выше, где Generic подклассы Evaluator и CFG. В Evaluator есть метод LoadPlugins, который делает то, что предлагает его имя, передавая this в DLL через метод Connect. Что ж, в первом сценарии приведение к Generic * в Connect должно вернуть NULL. Однако во втором сценарии, насколько мне известно, должен быть возвращен действительный указатель. Похоже, этого не происходит. Я ошибаюсь по этому поводу?

1 Ответ

2 голосов
/ 19 ноября 2009

dynamic_cast, как известно, нарушает границы модулей со многими компиляторами (включая MSVC и gcc). Я не знаю точно, почему это так, но поиск в Google дает много хитов. Я бы порекомендовал сначала попытаться избавиться от dynamic_cast, а не пытаться выяснить, почему он возвращает ноль в вашем втором сценарии.

...