crossplatform.ru

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


  Ответ в Ошибка компилятора в хитрой ситуЁвине
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
LuckLess Дата 19.10.2007, 13:10
  если пронаследовать виртуально - тогда не будет компилироватся уже по другой причине.))) там одной виртуальной функции будет соответствовать два разных переопределения ))

а в стандарте !!unique!! final overrider :D
Andrew Selivanov Дата 19.10.2007, 12:00
  Гы :rolleyes:


Кстати возникла еще мысль, для четкости надо бы виртуально пронаследовать B1, B2 от I, дабы копии не таскать...
LuckLess Дата 19.10.2007, 10:52
 
Цитата(Andrew Selivanov @ 19.10.2007, 11:49) *
А серьезно - как то это напоминает мне паттерн Адаптер...


ну.. там б1 и б2 не должны от одного интерфеса наследоваться...

чесно говоря не могу сообразить где такое наследование можно применить)))
ну... только если взять COM где каждый интерфейс должен быть наследником IUnknown*
LuckLess Дата 19.10.2007, 10:51
  дада.. если пеменять местами B1 и B2 все ок) сам замечал :D
Andrew Selivanov Дата 19.10.2007, 10:49
  Прикольно :D

Временно вкрутив себе мозг разработчика МС я поставил следующий эксперимент:
class C : public B2, public B1
   {
public:
    using B2::f;
   };


Как ты думаешь, что выведется на этот раз? ;)

А серьезно - как то это напоминает мне паттерн Адаптер...
ViGOur Дата 19.10.2007, 10:29
  Интересно, а где подобной может понадобиться... :)
Хотя с другой стороны, подобное использование using было введено, значит где-то может быть и пригодиться.
LuckLess Дата 19.10.2007, 10:21
  ну... начну с кода...
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 ();

Возможно есть еще варианты... но чтото в голову они не приходят...
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 0:10