使用基类中的函数静态调用纯虚函数的派生类实现

时间:2014-05-02 15:11:29

标签: c++ inheritance static pure-virtual

在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的空白实例,但在我看来,我不应该这样做。

3 个答案:

答案 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   用于确定调用哪个函数的特定对象。一个虚拟的   在一个类中声明的函数可以在另一个类中声明为朋友   类。 - 后注]