如果没有显式限定名称,如何调用纯虚函数?

How can a pure-virtual function be invoked without its name being explicitly qualified?

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

A virtual member function is odr-used if it is not pure. A non-overloaded function whose name appears as a potentially-evaluated expression or a member of a set of candidate functions, if selected by overload resolution when referred to from a potentially-evaluated expression, is odr-used, unless it is a pure virtual function and its name is not explicitly qualified.

根据上面突出显示的文本,可以调用纯虚函数作为潜在求值表达式,而无需显式限定其名称。 This answer by Michael Burr 好像是唯一的方法,可以调用纯虚函数,而且必须使用限定名。

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

How can a pure-virtual function be invoked without its name being explicitly qualified?

这是一般情况。借用评论中Yakk的例子:

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

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

此处调用了纯虚函数 Foo::bar,但没有明确限定。因此,根据引用的段落,Foo::barnot odr-used,因此不需要定义它。相反,它在派生的 classes 中的非纯覆盖器是 odr-used,它们是需要定义的函数。

但是,如果您显式限定对纯虚函数的调用,则会导致它变为 odr-used,并且它需要一个定义。这最常发生在纯虚拟析构函数中,因为派生的 class 析构函数总是调用基础 class 析构函数 ,就好像它们是完全合格的 一样。这就是为什么需要定义纯虚拟析构函数的原因。