crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Ошибка компилятора в хитрой ситуЁвине
LuckLess
  опции профиля:
сообщение 19.10.2007, 10:21
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


ну... начну с кода...
class I
   {
public:
   virtual void f ()
      {
      std::cout << "I";
      }
   };

class B1 : public I
   {
public:
   void f ()
      {
      std::cout << "B1";
      }
   };

class B2 : public I
   {
public:
   void f ()
      {
      std::cout << "B2";
      }
   };

class C : public B1, public B2
   {
public:
   using B2::f;
   };

int main ()
   {
   C c;
   c.f ();
   }


я думаю.. многие ожидали бы вывода B2.. но 8-я студия выводит B1 :D

а на саамом деле все еще лучше.. фактически этот код не должен компилироватся так как
Цитата
Then in any well-formed class, for each virtual function
declared in that class or any of its direct or indirect base classes there is a unique final overrider that overrides that
function and every other overrider of that function. The rules for member lookup (10.2) are used to determine the final
overrider for a virtual function in the scope of a derived class but ignoring names introduced by using-declarations.
[ Example:
struct A {
virtual void f();
};
struct B : virtual A {
virtual void f();
};
struct C : B , virtual A {
using A::f;
};
void foo () {
C c;
c.f (); / / calls B::f, the final overrider
c.C::f (); / / calls A::f because of the using-declaration

Насколько мне известно ни один компилятор не ведет себя тут правильно.

Ну... как же вызвать B2::f... есть несколько варантов.. и все кривоватые(хотя наследование от
двух классов, которые наследуются от одинокового интерфейса уже наверняка криво) )

Вариант1.
C c;
c.C::f ();
как в примере из стандарта.. согласитесь :p не очень удобно так писать - да?)))

Вариант2.
C c;
c.B2::f ();
еще хуже чем вариант1 ))

Вариант3
class C : public B1, public B2
{
public:
void f ()
{
return B2::f ();
}
};

и так для каждой функции..)) тоже не удобно и много лишнего кода.. но зато функцию f можно использовать нормально
C c;
c.f ();

Возможно есть еще варианты... но чтото в голову они не приходят...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
LuckLess
  опции профиля:
сообщение 19.10.2007, 10:51
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


дада.. если пеменять местами B1 и B2 все ок) сам замечал :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 12:14