Используется виртуальная функция-член, если она не чистая?

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();
}
8
задан Armen Tsirunyan 10 November 2010 в 15:42
поделиться