C++ 我们可以有一个虚拟的静态方法吗?(c+;+;)
可能重复:C++ 我们可以有一个虚拟的静态方法吗?(c+;+;),c++,static,virtual,C++,Static,Virtual,可能重复: 我们可以有一个虚拟静态方法(在C++中)吗?我试着编译以下内容 代码: 所以我猜答案是否定的,但为什么呢 谢谢, Ron否。类中函数的静态表示该函数不需要对象来操作virtual表示实现取决于调用对象的类型。对于static,没有调用对象,因此在同一个函数上同时使用static和virtual是没有意义的 。其中有虚拟函数查找表。一个快速的google可以告诉你更多关于虚拟函数查找表的信息。不要认为这是可能的,因为你可以调用A::F()没有对象A。 将其虚拟化和静态化将意味着矛盾。
我们可以有一个虚拟静态方法(在C++中)吗?我试着编译以下内容 代码: 所以我猜答案是否定的,但为什么呢 谢谢,
Ron否。
类中函数的静态
表示该函数不需要对象来操作virtual
表示实现取决于调用对象的类型。对于static,没有调用对象,因此在同一个函数上同时使用static
和virtual
是没有意义的
。其中有虚拟函数查找表。一个快速的google可以告诉你更多关于虚拟函数查找表的信息。不要认为这是可能的,因为你可以调用
A::F()代码>没有对象A。
将其虚拟化和静态化将意味着矛盾。不,静态
函数类似于全局函数,但也在类名称空间内virtual
意味着在派生类中继承和重新实现-您不能重新实现“全局”函数。Aha,那么static意味着*这不存在,virtual意味着方法有一个this指针。两者的结合形成了矛盾。尼斯:)谢谢,没有矛盾。在A::F()
中,类是硬编码的,而在this->F()
中,可以从对象中派生要调用的正确函数(通过虚拟函数查找)。事实是C++没有支持这个。在Python中,它是开箱即用的:您的答案是正确的,但您的解释是错误的。您可以使用对象来确定要调用哪个静态方法。在Python中,它的工作原理是:“不使用户,你也可以从C++中的对象调用静态函数,这样你就可以做<代码> fStistAfSype()/<代码>以及'f::STATICH函数()。(我说不需要一个对象,不能调用)。但你是对的——在我们有一个对象C++的情况下,可以使用VTABLE查找一个适当的函数——在这种情况下,虚拟静态是有意义的。正如你所说的,过载可以用来将虚拟调用转发到正确的静态函数(或者编译器认为这是模糊的)吗?没有真正的理由。它只是在C++中不被支持。(它在Python中工作:)-可以围绕静态方法创建虚拟包装器:一个忽略对象并将调用转发给静态方法的虚拟方法。
#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;
}
member 'f' cannot be declared both virtual and static