友人と私は、オブジェクトの構築について非常に興味深い議論を交わし、最終的に次のコードに行き着きました。
#include <iostream>
class Parent {
public:
Parent( ) {
this->doSomething( );
}
virtual void doSomething( ) = 0;
};
class Child : public Parent {
int param;
public:
Child( ) {
param = 1000;
}
virtual void doSomething( ) {
std::cout << "doSomething( " << param << " )" << std::endl;
}
};
int main( void ) {
Child c;
return 0;
}
純粋な仮想関数がコンストラクタまたはデストラクタから呼び出されたときの動作を標準が定義していないことはわかっています。また、これは本番環境でコードを記述する方法の実際的な例ではありません。コンパイラが何をするかを確認するための単なるテストです。 .
Java プリントで同じ構造をテストする
何かをする( 0 )
親コンストラクターから呼び出されparam
た時点で初期化されていないため、これは理にかなっています。doSomething()
C++ でも同様の動作が予想さparam
れますが、関数が呼び出された時点で何かが含まれているという違いがあります。
(c++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3)
代わりに、上記のコードをコンパイルすると、への参照Parent::doSomething( )
が未定義であるというリンカ エラーが発生します。
だから、私の質問は:なぜこれはリンカ エラーですか? これがエラーである場合、特に関数の実装があるため、コンパイラが文句を言うと思います。この場合、リンカがどのように機能するか、またはさらに読むための参照についての洞察は高く評価されます。
前もって感謝します!この質問が重複していないことを願っていますが、同様の質問が見つかりませんでした..