如果它不纯,会使用虚拟成员函数吗?

Arm*_*yan 8 c++ pure-virtual one-definition-rule language-lawyer

C++03 3.2.2 ...如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用该函数.如果它不是纯粹的,则使用虚拟成员函数...

然后3.2.3我们得到:每个程序应该只包含该程序中使用的每个非内联函数或对象的一个​​定义; 无需诊断.该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见12.1,12.4和12.8).内联函数应在每个使用它的翻译单元中定义.

我正在阅读的内容:不使用纯虚函数.ODR仅适用于使用的功能.这不意味着以下是合法的吗?我猜答案是否定的,但事实并非如此,我无法理解为什么.

//x.h
struct A
{
   virtual void f() = 0;
};

//y.cpp
#include "x.h"
void A::f()
{
}

//z.cpp
#include "x.h"
#include <iostream>
void A::f()
{
   std::cout << "Hello" << std::endl;
}

//main.cpp
#include "x.h"
struct B:A
{
   virtual void f()
   {
      A::f();
   }
};

int main()
{
   A* p = new B;
   p->f();
}
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 11

这两个条款并不相互排斥.如果虚函数不纯,则使用虚函数并不意味着反过来.如果虚函数是纯函数,则并不意味着它必然不被使用.它可能仍然被用于"如果它的名字出现在一个可能被评估的表达式中",例如在你的例子中:A::f();.

  • @Armen Tsirunyan:再次仔细阅读该条款.纯虚函数也不例外; 非纯虚函数的例外是自动_used_,无论它们是否也以任何其他方式_used_. (2认同)