为静态函数继承故意使用名称隐藏

Intional use of name hiding for static function inheritance

我有一个基础 class Base 和一些子 classes BaseDerivate1 .. BaseDerivateN。我的部分代码是通用的,通过定义 BASE_DERIVATE 访问使用的 class 支持任何子 classes。

我现在需要添加一个子 classes 可以声明但不必声明的静态函数。对于声明 StaticFunc() 的派生 classes,我想调用它。在所有其他情况下,我想调用回退函数 Base::StaticFunc()。调用如下所示:

#define BASE_DERIVATE BaseDerivate1 // or some other child class

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

所以我特意在这里隐藏了姓名。 StaticFunc 永远不会从 class 中调用。我的问题是:这是否受 C++ 标准支持,或者这会导致某些编译器出现编译器错误。另外:有没有更好的方法来做 "static inheritance"?然而,我坚持定义 BASE_DERIVATE 概念。

这将 "just work":

#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();