One Definition Rule は次のように述べています。
プログラム全体で、オブジェクトまたは非インライン関数は複数の定義を持つことはできません。(ウィキペディアより)
メンバー関数がヘッダー ファイルで定義されている場合、それは暗黙的にインライン化され、ODR で問題ないことはわかっています。
しかし、仮想関数はどうでしょうか? 仮想関数が多態的に呼び出される場合、インライン化できないことがわかっています。そのような仮想関数がヘッダー ファイルで定義されている場合、ODR に違反しますか?
例えば:
//derived.hpp
#include <iostream>
class Base {
public:
virtual ~Base() {}
virtual void vfunc() {
std::cout << "Base::vfunc()\n";
}
};
class Derived : public Base {
public:
virtual ~Derived() {}
virtual void vfunc() {
std::cout << "Derived::vfunc()\n";
}
};
//foo.cpp
#include "derived.hpp"
void func() {
Base* ptr = new Derived();
ptr->vfunc(); //polymorphic call, can't be inlined
delete ptr;
ptr = new Base();
ptr->vfunc();
delete ptr;
}
//main.cpp
#include "derived.hpp"
int main() {
Base* ptr = new Derived();
ptr->vfunc(); //polymorphic call, can't be inlined
delete ptr;
ptr = new Base();
ptr->vfunc();
delete ptr;
return 0;
}
私は興味があります:
vfunc(および dtor) は foo.cpp と main.cpp の両方でポリモーフィックに (インライン化されずに) 呼び出されます。つまり、プログラム全体で 2 回定義されているため、ODR に違反していますね。どのようにコンパイルしますか(リンク)?
私はちょうどそれを見ました:
複数の定義
場合によっては、型またはテンプレートの定義が複数存在することがあります。複数のヘッダー ファイルとソース ファイルで構成されるプログラムには、通常、1 つの型の定義が複数ありますが、翻訳単位ごとに複数の定義はありません。プログラムに型の複数の定義が含まれている場合、各定義は同等でなければなりません (これもウィキペディアから取得)。
とは何certain cases
ですか? 上記のケースはその1つでしょうか?