您将在C ++ 11中的[basic.def.odr]/2
中找到以下文字:
虚拟成员函数如果不纯,则使用odr。 :一种 非重载函数,其名称显示为可能已评估的函数 表达式或一组候选函数的成员(如果选择) 从潜在评估中引用的重载决策 表达式,是odr-used,除非它是纯虚函数及其 名称未明确限定。
根据上面突出显示的文本,可以将纯虚函数作为可能已评估的表达式调用,而不会明确限定其名称。 This answer Michael Burr似乎显示了唯一的方法,可以调用纯虚函数,并且必须使用限定名称。
PS:对于那些想知道为什么我仍然将这个问题提到C ++ 11标准的人,请参阅我之前的问题here。
答案 0 :(得分:3)
如果不明确限定名称,如何调用纯虚函数?
这是普通的情况。从评论中借用Yakk的例子:
struct Foo {
virtual void bar() = 0;
};
void quux(Foo* f) {
f->bar();
}
这里正在调用纯虚函数Foo::bar
而没有明确的限定。因此,根据引用的段落,Foo::bar
不使用odr,因此不需要定义。相反,它在派生类中的非纯覆盖是经常使用的,它们是需要定义的函数。
但是如果你明确地限定了对纯虚函数的调用,那么你会使它变得使用它,并且它需要一个定义。这通常发生在纯虚拟析构函数中,因为派生类析构函数总是调用基类析构函数,就像它们是完全限定的一样。这就是为什么需要定义纯虚拟析构函数的原因。