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
. - person Philipp   schedule 10.11.2010struct A { virtual void f() = 0; }; //y.cpp #include "x.h" void A::f() { }
Он реализует чисто виртуальную функцию. Хуже всего: он делает это дважды. - person Stephane Rolland   schedule 10.11.2010