相关疑难解决方法(0)

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

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)

c++ pure-virtual one-definition-rule language-lawyer

8
推荐指数
1
解决办法
403
查看次数