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();
}
main.cpp
),但这一点在标准中并不清楚,甚至是错误的,这取决于if
的含义。 - Philipp