Можно ли реализовать макрос __super? - PullRequest
2 голосов
/ 18 мая 2011

Скажите, пожалуйста, есть ли способ вручную реализовать специфический для Microsoft __ super макрос ...

Ответы [ 3 ]

7 голосов
/ 18 мая 2011
class Base{
public:
  void func(){
    // something
  }
};

class Derived : public Base{
public:
  void func(){
    Base::func(); // just use the base class name
  }
};

Хотя я предполагаю, что это не то, что вы хотите, и вы хотите универсальный доступ для каждого класса?Я не знаю прямого решения, но вы всегда можете typedef ваш непосредственный базовый класс:

class Derived : public Base{
  typedef Base super; // typedef accordingly in every class
public:
  void func(){
    super::func();
  }
};

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

template<class Base>
struct AddSuper : public Base {
protected:
  typedef Base super;
};

class Derived : public AddSuper<Base> {
public:
  void func(){
    super::func();
  }
};

Обратите внимание, что вы не должны забывать повторно вводить def в каждом производном классе, иначе вы получите дыры в вашей цепочке вызовов.

Один недостаток: вся конструкция разрушается несколькими базовыми классами.: /

3 голосов
/ 18 мая 2011

Ключевое слово super на самом деле было предложено давно в процессе стандартизации C ++, но оно было отклонено как ненужное, поскольку его можно было реализовать с помощью метода, описанного Xeo в его ответе - это описано в книге D & E Страуструпа.,Я думаю, что Microsoft решила, что это действительно необходимо, но будьте осторожны, если вы используете его, ваш код не будет переносимым.

3 голосов
/ 18 мая 2011

Избегайте этого, это делает ваш код непереносимым. Если вы хотите иметь краткое имя для своего базового класса, используйте typedef:

class Derived: public BaseWithALongName
{
   typedef BaseWithALongName super;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...