Нет, это прямо запрещено стандартом:
ISO 14882: 2003 C ++ Стандарт 13.1 / 2 - Объявления о перегрузке
Некоторые объявления функций не могут
перегружаться:
- Объявления функций, отличающиеся только типом возвращаемого значения, не могут быть перегружены.
- Объявления функций-членов с одинаковыми именами и одинаковыми типами параметров не могут быть перегружены
если какой-либо из них является
static
объявлением функции-члена (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
};
- конец примера]
...
Кроме того, в любом случае это было бы неоднозначно, поскольку в экземплярах можно вызывать статические функции:
ISO 14882: 2003 C ++ Стандарт 9.4 / 2 - Статические элементы
Статический член s
класса X
может быть
упоминается с использованием qualid-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
}
- конец примера]
...
Так что было бы двусмысленность с тем, что у вас есть:
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
. Поэтому невозможно проверить, вызывается ли функция статически или нет, как в PHP.
ISO 14882: 2003 C ++ Стандарт 9.3.2 / 1 - Указатель this
В теле нестатика (9,3)
функция-член, ключевое слово this
является
ненулевое выражение, значение которого равно
адрес объекта, для которого
функция вызывается.