在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的空白实例,但是在我看来,我不必这样做。
最佳答案
在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 ++无法开箱即用):将类型视为对象。