Искусственное использование сокрытия имени для наследования статических функций - PullRequest
0 голосов
/ 04 октября 2018

У меня есть базовый класс Base и несколько подклассов BaseDerivate1 .. BaseDerivateN.Часть моего кода является общей и поддерживает любой из подклассов, получая доступ к используемому классу через определение BASE_DERIVATE.

Теперь мне нужно добавить статическую функцию, которую дочерние классы могут объявлять, но не обязаны.Для производных классов, которые объявляют StaticFunc(), я хочу назвать это.Во всех остальных случаях я хочу вызвать резервную функцию Base::StaticFunc().Вызов выглядит так:

#define BASE_DERIVATE BaseDerivate1 // or some other child class

// somewhere else:
BASE_DERIVATE::StaticFunc();

Так что я намеренно использую скрытие имени здесь.StaticFunc никогда не вызывается из класса.У меня есть вопрос: это поддерживается стандартом C ++ или это приведет к ошибкам компилятора для некоторых компиляторов.Также: есть ли лучший способ сделать «статическое наследование»?Однако я застрял с концепцией определения BASE_DERIVATE.

1 Ответ

0 голосов
/ 04 октября 2018

Это будет «просто работать»:

#include <iostream>

class Base { 
    public: static void foo() { std::cout << "Base::foo()\n"; }
};

class Derived1 : public Base { };
class Derived2 : public Base { 
    public: static void foo() { std::cout << "Derived2::foo()\n"; }
};

int main() {
    Derived1::foo(); // prints "Base::foo()"
    Derived2::foo(); // prints "Derived2::foo()"
}

Это обычное теневое копирование имен, которое одинаково работает и для статических членов.Статическая реализация Base все еще доступна из Derived2 с помощью довольно забавного синтаксиса:

Derived2::Base::foo();
...