如果没有显式限定名称,如何调用纯虚函数?
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::bar
是 not odr-used,因此不需要定义它。相反,它在派生的 classes 中的非纯覆盖器是 odr-used,它们是需要定义的函数。
但是,如果您显式限定对纯虚函数的调用,则会导致它变为 odr-used,并且它需要一个定义。这最常发生在纯虚拟析构函数中,因为派生的 class 析构函数总是调用基础 class 析构函数 ,就好像它们是完全合格的 一样。这就是为什么需要定义纯虚拟析构函数的原因。
您将在 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::bar
是 not odr-used,因此不需要定义它。相反,它在派生的 classes 中的非纯覆盖器是 odr-used,它们是需要定义的函数。
但是,如果您显式限定对纯虚函数的调用,则会导致它变为 odr-used,并且它需要一个定义。这最常发生在纯虚拟析构函数中,因为派生的 class 析构函数总是调用基础 class 析构函数 ,就好像它们是完全合格的 一样。这就是为什么需要定义纯虚拟析构函数的原因。