Должно ли объявление использования скрывать унаследованную виртуальную функцию?

struct level0
{
  virtual void foo() = 0;
};

struct level1 : level0
{
  virtual void foo() { cout <<" level1  " << endl; }
};

struct level2 : level1
{
  virtual void foo() { cout <<" level2 " << endl; }
};

struct level3 : level2
{
  using level1::foo;
};

int main()
{
  level1* l1 = new level3;
  l1->foo();
  level3 l3;
  l3.foo();
  return 0;
}

приведенный выше код с использованием gcc дает

level2
level1

но в icc дает

 level2
 level2

Какой из них правильный или не определен стандартом?

Изменить: Это доказывает, что есть ошибка, рассмотрим следующую основную функцию

int main()
{
    level3 l3;
    l3.foo();               // This prints level1

    level3* pl3 = &l3;
    pl3->foo();             // This prints level2

    level3& rl3 = l3;
    rl3.foo();              // This prints level1

    level3& rpl3 = *pl3;
    rpl3.foo();             // This prints level2

    return 0;
}

Таким образом, один и тот же объект при непосредственном использовании дает разные результаты, а при использовании через указатель одного типа дает разные результаты !!!

7 голосов | спросил balki 12 Jpm1000000pmWed, 12 Jan 2011 16:53:41 +030011 2011, 16:53:41

1 ответ


0

Пример в разделе 10.3p2 стандарта поясняет, что использование объявлений не переопределяет виртуальные функции.

Это известная ошибка g ++ .

Как вы заметили, при вызове функции-члена через ссылку или указатель, а не в случае, когда динамический тип известен, ошибка не возникает.

ответил aschepler 12 Jpm1000000pmWed, 12 Jan 2011 17:05:45 +030011 2011, 17:05:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132