Can we have a virtual static method ? (c++)
Possible Duplicate:
C++ static virtual members?
我们可以有一个虚拟静态方法(C++)吗?我试图编译以下内容代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream>
using namespace std;
class A
{
public:
virtual static void f() {cout <<"A's static method" << endl;}
};
class B :public A
{
public:
static void f() {cout <<"B's static method" << endl;}
};
int main()
{
/* some code */
return 0;
} |
但是编译器说:
1
| member 'f' cannot be declared both virtual and static |
所以我想答案是否定的,但为什么呢?
谢谢,罗恩
- 没有真正的理由。它只是在C++中不被支持。(它在python:ideone.com/fwtui中工作)-可以围绕静态方法创建虚拟包装器:忽略对象并将调用转发到静态方法的虚拟方法。
不,类中函数的static表示该函数不需要对象来操作。virtual表示实现取决于调用对象的类型。对于静态,没有调用对象,因此在同一个函数上同时使用static和virtual是没有意义的。.
- 你的回答是正确的,但你的解释不是。您可以使用一个对象来确定要调用哪个静态方法。在python中,它的工作方式是:ideone.com/fwtui
- "非-A用户"还可以从C++中的对象调用静态函数,这样就可以执行EDCOX1"0"以及"F::STATICH函数()"(我说不需要对象,不能调用)。但你是对的——在我们有一个对象C++的情况下,可以使用VTABLE查找一个适当的函数——在这种情况下,虚拟静态是有意义的。正如您所说,重载可以用于将虚拟调用转发到正确的静态函数(或者编译器是否认为这不明确?)
不要认为这是可能的,因为你可以在没有对象A的情况下调用A::F();。使其虚拟化和静态化意味着矛盾。
- aha,那么static意味着*这个不存在,virtual意味着这个方法有一个this指针。两者的结合产生了矛盾。Nice:谢谢
- 不,没有矛盾。在A::F()中,类是硬编码的,而在this->F()中,可以从对象(通过虚拟函数查找)派生调用的正确函数。事实是C++没有对此的支持。在python中,它是开箱即用的:ideone.com/fwtui
因为类没有this指针。其中有虚拟函数查找表。一个快速的谷歌可以告诉你关于虚拟函数查找表的更多信息。
不,static函数类似于全局函数,但也在类命名空间内。virtual意味着继承和在派生类中重新实现—不能重新实现"global"函数。