名称隐藏对静态函数继承的实例使用

Intional use of name hiding for static function inheritance

本文关键字:实例 继承 静态函数 隐藏      更新时间:2023-10-16

我有一个基类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概念。

这将"正常工作":

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