C++03 3.2.2
...その名前が潜在的に評価される式に現れる場合、オブジェクトまたはオーバーロードされていない関数が使用されます。純粋でない場合は、仮想メンバー関数が使用されます...
すべてのプログラムに3.2.3
は、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (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();
}