在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 ++无法开箱即用):将类型视为对象。

10-04 17:03