Виртуальная функция-член используется, если она не является чистой?
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();
}