您会在C 11中的[basic.def.odr]/2
中找到以下文本:
如果虚拟成员函数不纯化,则使用ODR函数。 a 非载荷功能的名称显示为潜在评估 Expression 或一组候选功能的成员,如果由 从潜在评估中提及的超负荷分辨率 表达式,是用ODR使用的,除非它是纯虚拟函数,否则 名称不明确。
根据上述突出显示的文本,可以将纯虚拟函数作为潜在评估的表达式调用,而不会明确地将其名称提出。迈克尔·伯尔(Michael Burr)的这个答案似乎显示出唯一的方法,可以调用纯虚拟功能,并且必须使用合格的名称。
ps:对于那些想知道为什么我仍然将问题转介给C 11标准的人,请在此处查看我的先前问题。
如何调用纯虚拟功能,而无需明确的名称?
那是普通的情况。从评论中借用Yakk的示例:
struct Foo {
virtual void bar() = 0;
};
void quux(Foo* f) {
f->bar();
}
在这里,纯虚拟函数Foo::bar
被调用而没有明确的资格。因此,根据引用的段落,Foo::bar
是不是 odr-使用的,因此不需要定义它。取而代之的是,其在派生类中的非纯效力是ODR使用的,它们是需要定义的函数。
但是,如果您明确符合纯虚拟函数的呼叫,则使其成为ODR使用,并且需要定义。这最常见的是纯虚拟破坏者,因为派生的类驱动器总是会唤起基类击路剂,好像它们是完全合格的。这就是为什么需要定义纯虚拟破坏者的原因。