如何在不明确限定名称的情况下调用纯虚函数?

时间:2017-03-03 21:15:11

标签: c++ c++11 language-lawyer virtual-functions one-definition-rule

您将在C ++ 11中的[basic.def.odr]/2中找到以下文字:

  

虚拟成员函数如果不纯,则使用odr。 :一种   非重载函数,其名称显示为可能已评估的函数   表达式或一组候选函数的成员(如果选择)   从潜在评估中引用的重载决策   表达式,是odr-used,除非它是纯虚函数及其   名称未明确限定

根据上面突出显示的文本,可以将纯虚函数作为可能已评估的表达式调用,而不会明确限定其名称。 This answer Michael Burr似乎显示了唯一的方法,可以调用纯虚函数,并且必须使用限定名称。

PS:对于那些想知道为什么我仍然将这个问题提到C ++ 11标准的人,请参阅我之前的问题here

1 个答案:

答案 0 :(得分:3)

  

如果不明确限定名称,如何调用纯虚函数?

这是普通的情况。从评论中借用Yakk的例子:

struct Foo {
    virtual void bar() = 0;
};

void quux(Foo* f) {
    f->bar();
}

这里正在调用纯虚函数Foo::bar而没有明确的限定。因此,根据引用的段落,Foo::bar 使用odr,因此不需要定义。相反,它在派生类中的非纯覆盖是经常使用的,它们是需要定义的函数。

但是如果你明确地限定了对纯虚函数的调用,那么你会使它变得使用它,并且它需要一个定义。这通常发生在纯虚拟析构函数中,因为派生类析构函数总是调用基类析构函数,就像它们是完全限定的一样。这就是为什么需要定义纯虚拟析构函数的原因。