0

私は基本クラスBaseといくつかのサブクラスを持っていBaseDerivate1ます.. BaseDerivateN. 私のコードの一部はジェネリックであり、 define を介して使用されたクラスにアクセスすることにより、サブクラスのいずれかをサポートしていますBASE_DERIVATE

ここで、子クラスが宣言できる静的関数を追加する必要がありますが、宣言する必要はありません。を宣言する派生クラスについてはStaticFunc()、それを呼び出したいと思います。それ以外の場合は、フォールバック関数を呼び出したいと思いますBase::StaticFunc()。呼び出しは次のようになります。

#define BASE_DERIVATE BaseDerivate1 // or some other child class

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

そこで、ここでは意図的に名前を非表示にしています。StaticFuncがクラス内から呼び出されることはありません。私が持っている質問は、これは C++ 標準でサポートされているのか、それとも一部のコンパイラでコンパイラ エラーが発生するのかということです。また、「静的継承」を行うためのより良い方法はありますか? しかし、私は定義のBASE_DERIVATE概念にこだわっています。

4

1 に答える 1

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();
于 2018-10-04T10:25:44.290 に答える