Нет, это запрещено стандартом:
ISO 14882: 2003 C ++ Standard 13.1 / 2 - Перегружаемые объявления
Некоторые объявления функций не могут быть перегружены:
- Объявления функций, которые отличаются только возвращаемым типом, не могут быть перегружены.
- Объявления функций-членов с тем же именем и теми же типами параметров не могут быть перегружены, если какой-либо из них является
static
Объявление функции участника (9.4)....
[Пример:
blockquote>class X { static void f(); void f(); // ill-formed void f() const; // ill-formed void f() const volatile; // ill-formed void g(); void g() const; // OK: no static g void g() const volatile; // OK: no static g };
-End example]
...
blockquote>Кроме того, это было бы неоднозначно, так как можно вызвать статические функции для экземпляров:
ISO 14882: 2003 C ++ Standard 9.4 / 2 - Статические элементы
Статический член
blockquote>s
классаX
может ссылаться на использование qualified-id выражениеX::s
; нет необходимости использовать синтаксис доступа к члену класса (5.2.5) для ссылки наstatic member
. Членstatic
может ссылаться на использование синтаксиса доступа к члену класса, и в этом случае оцениваетсяobject-expression
. [Пример:class process { public: static void reschedule(); } process& g(); void f() { process::reschedule(); // OK: no object necessary g().reschedule(); // g() is called }
-end example]
...
blockquote>Таким образом, была бы двусмысленность с тем, что у вас есть:
class Foo { public: string bla; Foo() { bla = "nonstatic"; } void print() { cout << bla << endl; } static void print() { cout << "static" << endl; } }; int main() { Foo f; // Call the static or non-static member function? // C++ standard 9.4/2 says that static member // functions are callable via this syntax. But // since there's also a non-static function named // "print()", it is ambiguous. f.print(); }
Чтобы решить вопрос о том, можно ли проверить, какой экземпляр вызывает функцию-член , есть ключевое слово
this
. Ключевое словоthis
указывает на объект, для которого была вызвана функция. Однако ключевое словоthis
всегда будет указывать на объект, т. Е. Он никогда не будетNULL
. Поэтому невозможно проверить, вызвана ли функция статически или нет à la PHP.ISO 14882: 2003 C ++ Standard 9.3.2 / 1 - Этот указатель
В теле нестатической (9.3) функции-члена ключевое слово
blockquote>this
является выражением не-lvalue, значение которого является адресом объекта, для которого вызывается функция.