在stackoverflow的其他地方有一些关于这个主题的讨论,但我还没有真正找到我的问题的明确答案。
我的设置是这样的:
class BaseClass
{
virtual short return_number_for_thing1(std::string thing1)=0; //note the pure virtual
virtual short return_number_for_thing2(std::string thing2)=0;
virtual short return_number_for_thing(std::string thing); //virtual is probably not necessary here, I can get rid of it if need be
}
short BaseClass::return_number_for_thing(std::string thing)
{ //pretend thing1 and thing2 are enum'ed somewhere
if (thing == thing1) return return_number_for_thing1(thing);
else if (thing == thing2) return return_number_for_thing2(thing);
}
class DerivedClass1 : BaseClass
{
short return_number_for_thing1(std::string thing1);
short return_number_for_thing2(std::string thing2);
}
class DerivedClass2 : BaseClass
{
short return_number_for_thing1(std::string thing1);
short return_number_for_thing2(std::string thing2);
}
我的问题是,为什么我不能写这样的代码:
short number_i_want = DerivedClass2::return_number_for_thing(thing);
我有点理解尝试从BaseClass指针调用return_number_for_thing没有意义,因为它不知道是否为DerivedClass1或DerivedClass2调用例程,但是如果我给它DerivedClass2的范围,那就不应该能够找出我想要的东西吗?现在,我需要时创建DerivedClass2或DerivedClass1的空白实例,但在我看来,我不应该这样做。
答案 0 :(得分:1)
您可以创建虚拟或静态功能,而不是两者。
虚函数必须有一个vtable指针,它需要一个对象的实例,静态函数不能(根据定义)有一个与之相关的实例。
如果您将函数声明为例如:
virtual short return_number_for_thing1(std::string thing1)=0;
然后你必须创建一个实例并使用它,例如m_Instance->return_number_for_thing1(...)
(但是因为你没有使用任何成员变量,所以这似乎没有意义)。
如果将函数声明为static:
static short return_number_for_thing1(std::string thing1)
然后你必须静态地调用函数BaseClass::return_number_for_thing1()
,如果你在派生类中提供了相同函数的静态版本,它现在变成了一个覆盖,你选择在编译时调用哪一个{{1 }或BaseClass::return_number_for_thing1
..
由于您无法静态使用虚拟功能,因此您的问题仍然没有意义。静态地暗示你想要在没有任何实例的情况下使用它,它就像一个c函数,但隐藏在类的命名空间中(并遵守隐私)。虚函数需要一个可以操作的实例。
答案 1 :(得分:1)
在C ++中,虚拟和静态不混合。
virtual
=具体操作取决于对象的类型。static
=您不需要对象。然而,当然可以想象这样的事情。如果C ++有类似元类型的东西,允许你将常规的类型视为对象,那么它就不再那么奇怪了。
伪代码(使用虚构语法):
void f(Class base_class)
{
base_class.StaticMethod();
}
struct Base
{
virtual static StaticMethod(); // impossible in C++
};
struct Derived : Base
{
virtual static StaticMethod(); // impossible in C++
};
f(Base); // impossible in C++
f(Derived); // impossible in C++
创建像静态虚函数这样的东西的欲望有时是真正需要的症状(C ++无法实现开箱即用):将类型视为对象。
答案 2 :(得分:0)
制作static virtual
方法是不可能的,引用C++11 standard N3337 - 10.3.10:
[注意:虚拟说明符意味着成员身份,因此是虚拟的 函数不能是非成员(7.1.2)函数。 也不能虚拟 function是一个静态成员,因为虚函数调用依赖于a 用于确定调用哪个函数的特定对象。一个虚拟的 在一个类中声明的函数可以在另一个类中声明为朋友 类。 - 后注]