суббота, 7 августа 2010 г.

Удобная работа с родительскими классами

Очень часто, при наследовании, хочется иметь удобный способ вызова функций родительского класса. Для этого можно завести пару дефайнов:

  1. #define DECLARE_ROOT_OBJECT(cls)    \
  2.     typedef cls  Self;    \
  3.  
  4. #define DECLARE_OBJECT(cls)    \
  5.     typedef Self  Super;    \
  6.     typedef cls Self;

Использовать так:

  1. class Base
  2. {
  3. public:
  4.     DECLARE_ROOT_OBJECT(Base)
  5.  
  6.     virtual void Foo();
  7. };
  8.  
  9. class Derived : public Base
  10. {
  11. public:
  12.     DECLARE_OBJECT(Derived)
  13.  
  14.     void Foo()
  15.     {
  16.         Super::Foo();
  17.     }
  18. };
Метод взят из обсуждения подсказки на сайте Gamedev.ru 

* Подсветка синтаксиса http://quickhighlighter.com

4 комментария:

  1. Интересно. Но ведь и так, чтобы обратиться к родительскому достаточно написать Base::Foo(); Зато, конечно, появилась универсальность обращения. А что если классов будет много? Варнинги не вылезут на передефайны?

    ОтветитьУдалить
  2. Нет, не вылезут, они в разных скоупах...

    ОтветитьУдалить
  3. А как быть с множественным наследованием?

    ОтветитьУдалить