C ++ 03 3.2.2
... Объект или неперегруженная функция используется, если его имя появляется в потенциально оцениваемом выражении. Виртуальная функция-член используется, если она не чистая ...
А позже в 3.2.3
мы имеем: Каждая программа должна содержать ровно одно определение каждой не встроенной функции или объект, который используется в этой программе; диагностика не требуется. Определение может явным образом отображаться в программе,
Встроенная функция должна быть определена в каждой единице перевода, в которой она используется.
Вдоль строк, которые я читаю: чистая виртуальная функция не используется. 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();
}