Есть ли переносимая замена super?
От: Digger Россия  
Дата: 04.04.03 11:37
Оценка:
В VC++7 ввели такую хорошую вещь как super, но нет ли переносимого способа реализовать, тоже самое (доступ к суперклассу без упоменания его имени)?
Чтобы писать программы голова не нужна, нужна клавиатура.
Re: Есть ли переносимая замена super?
От: ssm Россия  
Дата: 04.04.03 11:39
Оценка: 1 (1)
Здравствуйте, Digger, Вы писали:

D>В VC++7 ввели такую хорошую вещь как super, но нет ли переносимого способа реализовать, тоже самое (доступ к суперклассу без упоменания его имени)?


А что в ней еще хорошего кроме непереносимости?
Re: Есть ли переносимая замена super?
От: Left2 Украина  
Дата: 04.04.03 12:50
Оценка: 18 (1)
Здравствуйте, Digger, Вы писали:

D>В VC++7 ввели такую хорошую вещь как super, но нет ли переносимого способа реализовать, тоже самое (доступ к суперклассу без упоменания его имени)?


Как завещал товарищ Страуструп:

class A : public B
{
typedef B super;
public:

A() : super(<params>)
{
}

}


Хотя он завещал не super, а inherited
Re[2]: Есть ли переносимая замена super?
От: Павел Кузнецов  
Дата: 04.04.03 13:12
Оценка: 19 (2)
Здравствуйте, Left2, Вы писали:

D>> В VC++7 ввели такую хорошую вещь как super <...>


L>
L> class A : public B
L> {
L>   typedef B super;
L>


Это не является адекватной заменой __super. Например:

class B
{
public:
  void f(int);
};

class C
{
public:
  void f(double);
};

class A : public B, public C
{
public:
  void g()
  {
    __super::f(10);  // эквивалентно B::f(10);
    __super::f(0.5); // эквивалентно C::f(0.5);
  }
};
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Есть ли переносимая замена super?
От: Lorenzo_LAMAS  
Дата: 04.04.03 13:13
Оценка:
Что это за super, как выглядит его использование? А главное, так ли это нужно?
Of course, the code must be complete enough to compile and link.
Re[3]: Есть ли переносимая замена super?
От: Lorenzo_LAMAS  
Дата: 04.04.03 13:29
Оценка:
Павел, а ты пользуешься этой "чудесной" возможностью?
Надеюсь, в стандарт такого вносить не станут?
Of course, the code must be complete enough to compile and link.
Re[3]: Есть ли переносимая замена super?
От: MaximE Великобритания  
Дата: 04.04.03 13:34
Оценка: :)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>
ПК>class B
ПК>{
ПК>public:
ПК>  void f(int);
ПК>};

ПК>class C
ПК>{
ПК>public:
ПК>  void f(double);
ПК>};

ПК>class A : public B, public C
ПК>{
ПК>public:
ПК>  void g()
ПК>  {
ПК>    __super::f(10);  // эквивалентно B::f(10);
ПК>    __super::f(0.5); // эквивалентно C::f(0.5);
ПК>  }
ПК>};
ПК>


struct Shim : public B, public C {};

class A : public Shim
{
    typedef Shim super;

public:
    void g()
    {
        super::f(10);
        super::f(0.5);
    }
}
Re[4]: Есть ли переносимая замена super?
От: Lorenzo_LAMAS  
Дата: 04.04.03 13:38
Оценка:
Поздравляю с ambiquity
Of course, the code must be complete enough to compile and link.
Re[2]: Есть ли переносимая замена super?
От: Digger Россия  
Дата: 04.04.03 13:40
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>Что это за super, как выглядит его использование? А главное, так ли это нужно?


Например:

class A
{
virtual void F(){};
};

class B: public A
{
virtual void F(){
...
__super::F();
};
};

как видно, для доступа к суперклассу не нужно знать его имя, а это иногда удобно (например в шаблоне).
Чтобы писать программы голова не нужна, нужна клавиатура.
Re[3]: Есть ли переносимая замена super?
От: Lorenzo_LAMAS  
Дата: 04.04.03 13:42
Оценка:
Из ответа Павла Кузнецова я уже понял что это. Мне такое не нравится.
Of course, the code must be complete enough to compile and link.
Re[4]: Есть ли переносимая замена super?
От: Павел Кузнецов  
Дата: 04.04.03 13:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL> Павел, а ты пользуется этой "чудесной" возможностью?


Я предпочитаю использовать переносимые решения, пока не "подопрет".
(В смысле, пока не пользуюсь).

LL> Надеюсь, в стандарт такого вносить не станут?


Почему? На мой взгляд, достаточно удобная штуковина, особенно в шаблонах.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Есть ли переносимая замена super?
От: MaximE Великобритания  
Дата: 04.04.03 14:11
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>Поздравляю с ambiquity


Не подумал. Облажался.

Внесены изменения автора. -- ПК.
Re[5]: Есть ли переносимая замена super?
От: MaximE Великобритания  
Дата: 04.04.03 14:42
Оценка: 8 (2)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>Поздравляю с ambiquity


А если

struct Shim : B, C
{
    using B::f;
    using C::f;
};


?
Re[6]: Есть ли переносимая замена super?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.04.03 14:47
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>
ME>struct Shim : B, C
ME>{
ME>    using B::f;
ME>    using C::f;
ME>};
ME>


Увы
error C2875: using-declaration causes a multiple declaration of 'C::f'
... << RSDN@Home 1.0 beta 6a >>
Re[7]: Есть ли переносимая замена super?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.04.03 14:55
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Увы

ММ>
error C2875: using-declaration causes a multiple declaration of 'C::f'


Забыл уточнить. Это — под VC6SP5.
А вот GCC правильно отрабатывает

Так что one more standard compliance issue...
... << RSDN@Home 1.0 beta 6a >>
Re[8]: Есть ли переносимая замена super?
От: MaximE Великобритания  
Дата: 04.04.03 15:06
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Забыл уточнить. Это — под VC6SP5.

ММ>А вот GCC правильно отрабатывает

ММ>Так что one more standard compliance issue...


Так значит на gcc работает?
Re[9]: Есть ли переносимая замена super?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.04.03 16:03
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Так значит на gcc работает?


Работает. Вот пример, который я запускал:
#include <iostream>

struct B
{
    void f(int) { std::cout << "B::f()\n"; }
};

struct C
{
    void f(double) { std::cout << "C::f()\n"; }
};

struct Shim : public B, public C
{
    using B::f;
    using C::f;
};

class A : public Shim
{
    typedef Shim super;

public:
    void g()
    {
        super::f(10);
        super::f(0.5);
    }
};

int main()
{
    A a;
    a.g();
    
    return 0;
}
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.