不行,这是标准直接禁止的:
ISO 14882:2003 C++标准13.1/2 – 可重载声明
某些函数声明不能被重载:
- 只有返回类型不同的函数声明不能被重载。
- 如果其中任何一个成员函数声明是
static
成员函数声明(9.4),则具有相同名称和参数类型的成员函数声明不能被重载。
...
[例子:
class X {
static void f();
void f();
void f() const;
void f() const volatile;
void g();
void g() const;
void g() const volatile;
};
—示例结束]
...
此外,即使在实例上调用静态函数也是可能的,因此会存在歧义:
ISO 14882:2003 C++ 标准 9.4/2 – 静态成员
类 X
的静态成员 s
可以通过限定符表达式 X::s
来引用;不必使用类成员访问语法 (5.2.5) 来引用 static member
。可以使用类成员访问语法来引用 static
成员,此时将计算 object-expression
。[例如:
class process {
public:
static void reschedule();
}
process& g();
void f()
{
process::reschedule();
g().reschedule();
}
——示例结束]
...
因此,您所拥有的内容存在歧义:
class Foo
{
public:
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
int main()
{
Foo f;
f.print();
}
为了回答你关于如何检查成员函数在哪个实例上调用的问题,C++语言中提供了一个关键字
this
。它指向调用该函数的对象。然而,
this
关键字总是指向一个对象,即使在静态调用情况下也不能为
NULL
。因此,不可能像PHP那样检查一个函数是否以静态方式调用。
ISO 14882:2003 C++ Standard 9.3.2/1 – The this pointer
在非静态成员函数(9.3)体内,关键字 this
是一个非左值表达式,其值为调用该函数的对象的地址。
print()
具有相同的签名。我认为它们不能以这种方式进行重载。 - Mahesh