LINUX.ORG.RU

Замена ключевого слова super в С++

 , ,


0

1

Всем привет. Собственно интересует как можно обращаться к методам родительского класса из дочернего, наподобие синтаксиса Java: super.someMethod().

Единственное решение, какое придумал выглядит так:

class Base {
public:
        void method1();
        void method2();
}

class Derived : public Base {
private:
        Base base;
public:
        void method1() {
           base.method1();
           //что-то еще
        }
}

У кого какие идеи ка можно улучшить эту схему на случай виртуальных методов и т.д.?

Всем спасибо.

Ответ на: комментарий от Dudraug

Он там typedef забыл.

А super в c++ не имеет смысла, ведь нет разделения на интерфейсы и классы, вместо этого множественное наследование.

note173 ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Да, сработает.

Собственно, можно даже так делать (как такого добиться в Java не в курсе):


#include <iostream>

class Base
{
public:
  void Method1()
  {
    std::cout << "Base class" << std::endl;
  }
};

class Derived : public Base
{
public:
  void Method1()
  {
    Base::Method1();
    std::cout << "Derived class" << std::endl;
  }
};

class Yoba : public Derived
{
public:
  void Method1()
  {
    Base::Method1();
    std::cout << "ALLO" << std::endl;
  }
};
  
int main()
{
  Yoba a;
  a.Method1();
  return 0;
}

Redrum ()
Ответ на: комментарий от Dudraug

доказать то сможешь?

$ cat main.cpp 
#include <stdio.h>
class A {
public:
  void m() { printf("A::m()\n");}
};
class B : public A {
public:
  void m() { printf("B::m()\n"); A::m(); }
};
int main()
{
  B b;
  b.m();
  return 0;
}
$ g++ main.cpp -o main
$ ./main 
B::m()
A::m()

anonymous ()
Ответ на: комментарий от LongLiveUbuntu

Не нужно.

Не используй, но в языке оно есть.

Begemoth ★★★★★ ()
Ответ на: комментарий от Begemoth

А что с множественным наследованием делать?

Проблемы Си++. В Scala есть и множественное наследование трейтов, и слово super.

dave ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Тем не меннее, если в С++ чего нет, то его можно написать!

class Base                                                                                                                                      
{                                                                                                                                                
public:                                                                                                                                          
    int method1()                                                                                                                                
    {                                                                                                                                            
        return 1;                                                                                                                                
    }                                                                                                                                            
};                                                                                                                                               
                                                                                                                                                 
class Derive : public Base                                                                                                                       
{                                                                                                                                                
    typedef Base super;                                                                                                                          
                                                                                                                                                 
public:                                                                                                                                          
    int method2()                                                                                                                                
    {                                                                                                                                            
        return super::method1();                                                                                                                 
    }                                                                                                                                            
};   
AF ★★★ ()
Ответ на: комментарий от AF

А круче так, не проверял, но по идее должно работать

template<typename super>
class Derive : public super
{
public:
  int method2()
  {
    super::method1();
  }
};
Dudraug ★★★★★ ()
Ответ на: комментарий от AF

можно и совсем как в яве:

super.someMethod()

#include <stdio.h>
#define super (*(A*)this)
class A { public: void someMethod() { printf("A::someMethod()\n");} };
class B : public A {
  public: void someMethod() { printf("B::someMethod()\n"); super.someMethod(); }
};
int main() { B b; b.someMethod(); return 0; }
anonymous ()
Ответ на: комментарий от AF

а так пойдет?

#include <stdio.h>
#define super (*super_)
class A { public: void someMethod() { printf("A::someMethod()\n");} };
class B : public A {
private:
  A *super_;
public:.
  B(): super_(this) {}
  void someMethod() { printf("B::someMethod()\n"); super.someMethod(); }
};
int main() { B b; b.someMethod(); return 0; }

anonymous ()

Надо так:

this->Base::method1();

anonymous ()
Ответ на: комментарий от AF

уговорил, пусть будет так

#include <stdio.h>
#define super ((super_)(*this))
class A { public: virtual void someMethod() { printf("A::someMethod()\n");} };
class B : public A {
private:
  typedef A super_;
public:.
  virtual void someMethod() { printf("B::someMethod()\n"); super.someMethod(); }
};
int main() { B b; b.someMethod(); return 0; }

anonymous ()
Ответ на: комментарий от stevejobs

ну не сказал бы)
С++ пошел активно развиваться, в след. году обещают добавить поддержку ФС и для клиент-сервера && что-то еще, т.е, скопируют ну и конечно что-то добавят/уберут с того же boost::filesystem. Как сделали с тем же thread

Boy_from_Jungle ★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

а сейчас есть куча всего для С++, только не в стандарте

«не в стандарте» тут ключевое слово.
Ибо на каждый чих либо изобретать свой велосипед, либо пользоваться чужим.

Ладно ещё когда надо что-то специфичное, но для повседневных задач?

WatchCat ★★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

Работа со строками.
Чуть менее чем все программы так или иначе работают со строками.
А string в плюсах до сих пор был не пришей к пи^Wвагине рукав.
Даже открытие файла требовало char*.
Я уж не говорю про форматирование, регулярные выражения и прочая, и прочая.

WatchCat ★★★★★ ()
Ответ на: комментарий от WatchCat

Чуть менее чем все программы так или иначе работают со строками.

Хорошо там все со строками, ну c_str() вернет тебе чар, правда это аллочит новый кусок памяти обычно.

Я уж не говорю про форматирование, регулярные выражения и прочая, и прочая.

regex in c++11 and boost

Boy_from_Jungle ★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

к примеру, в libstdc++ просто возвращается указатель на данные, без всяких других действий

wota ★★ ()
Ответ на: комментарий от Boy_from_Jungle

еще раз, это зависит от реализации STL

только теоретически.

waker ★★★★★ ()
Ответ на: комментарий от stevejobs

«Паблик статик файнал Борщ борщ нью Борщ, пожалуйста.»

Кинул своим коллегам в чатрум:

Slava Zanko: С форума: Заходит джавист в столовую и говорит «Паблик статик файнал Борщ борщ нью Борщ, пожалуйста.»
VA: нью Борщ(300)..
AR: > «Паблик статик файнал Борщ борщ нью Борщ, пожалуйста.»
Паблик статик файнал Суп борщ нью Борщ, пожалуйста
AR: Суп - интерфес :)
DM: мне не нравится Паблик, я не хочу делиться
Slava Zanko: сразу видно джавистов: кинулись оптимизировать :)
Вы ещё тестами покройте...
SB: я столько не съем
VA: abstractFactory.getSup(), пожалуйста
Slava Zanko: повариха после этого вызовет совсем не абстрактную бригаду медиков.
AF: для тестов нужен эталонный борщ
IL: > повариха после этого вызовет совсем не абстрактную бригаду медиков.
garbage collector

Slavaz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.