Ответ 1
Нет, это запрещено стандартом:
ISO 14882: 2003 С++ Standard 13.1/2 - Перегружаемые объявления
Некоторые объявления функций не могут быть перегружен:
- Объявления функций, которые отличаются только возвращаемым типом, не могут быть перегружены.
- Объявления функций-членов с тем же именем и теми же типами параметров не могут быть перегружены если любое из них является объявлением функции
static
member (9.4)....
[Пример:
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 пример]
...
Кроме того, это было бы неоднозначно, так как можно было вызвать статические функции в экземплярах:
ISO 14882: 2003 Стандарт С++ 9.4/2 - Статические элементы
Статический член
s
классаX
может быть упоминается с использованием идентификатора с квалификацией выражениеX::s
; это не обязательно использовать синтаксис доступа к члену класса (5.2.5) для обозначения astatic 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 пример]
...
Таким образом, была бы двусмысленность с тем, что у вас есть:
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 also a non-static function named
// "print()", it is ambiguous.
f.print();
}
Чтобы задать вопрос о том, можно ли проверить, к какому экземпляру вызывается функция-член, существует ключевое слово this
. Ключевое слово this
указывает на объект, для которого была вызвана функция. Однако ключевое слово this
всегда указывает на объект, т.е. Он никогда не будет NULL
. Поэтому невозможно проверить, называется ли функция статически или нет à la PHP.
ISO 14882: 2003 С++ Standard 9.3.2/1 - Этот указатель
В теле нестатического (9.3) функция-член, ключевое слово
this
является выражение не-lvalue, значение которого равно адрес объекта, для которого вызывается функция.