first.cpp
クラス定義を含むこのファイルを検討し、次を使用します。
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
もう1つはsecond.cpp
、競合するクラス定義を含みます。
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
同じ名前の関数が2つ定義されている場合、リンカはシンボルの重複について文句を言いますが、クラスメソッドが重複しているこれらのファイルはエラーなしでコンパイルされます。
私はこれらのコマンドでコンパイルしました:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
2番目の呼び出しの引数を並べg++
替えても、出力は変更されません。
そして、first
が実行されると、これが出力になります。
$ ./first
Foo()
wrong ~Foo()
リンカが重複クラスメソッドを許可するのはなぜですか?明らかに許可されているのなら、なぜwrong ~Foo()
印刷されるのですか?