名称隐藏在静态函数继承中的常规使用

时间:2018-10-04 10:21:15

标签: c++ inheritance static name-hiding

我有一个基类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 :(得分:0)

这将“正常工作”:

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