2012-09-27 5 views
5

純粋な仮想関数f()を持つクラスBaseがあります。別のクラスDerivedBaseに由来します。私はf()からDerivedに電話します。 g ++を使用すると、リンカーからエラーが出ます。派生クラスがベースの純粋仮想関数を呼び出すときにg ++がエラーになるのはなぜですか?

[[email protected] tmp]$ g++ pure_virtual_function_call.cpp 
/tmp/ccGQLHi4.o: In function `Derived::f()': 
pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14): undefined reference to `VirtualBase::f()' 
collect2: error: ld returned 1 exit status 

エラーがリンカーによってキャッチされたようです。なぜコンパイラはこのエラーを報告しなかったのですか?なぜそれをリンカーに任せていますか?それは純粋仮想関数を呼び出すとエラーではありません

​​
+2

ソースコードを表示してください。そうすれば理解しやすくなります。 –

+0

サンプルコードを示してください。それがなければ、答えるのが難しいでしょう。 –

答えて

12

純粋な仮想関数は定義を持つことができ、そうであれば、構文VirtualBase::f()を使用して非仮想的に呼び出すことができます。

コンパイラでは、関数を定義するかどうかを判断する方法がないため、エラーはリンカーによってのみ検出されます。

+0

純粋な仮想が定義を持つことができる場合の例は? –

+2

@AgnelKurian:どういう意味ですか?どんな純粋な仮想関数も定義を持つことができます。 –

+1

私は純粋な仮想関数が定義を持つことができるのか分かりませんでした。ありがとう。 –

8

:ここ

はコードです。定義のない関数を呼び出すのは誤りです。純粋仮想関数は定義を持つことができます。

+0

純粋な仮想が定義を持つことができる場合の例は? –

+2

@AgnelKurianいつでも'クラスC {仮想void f()= 0; }; void C :: f(){} ' –

+1

仮想呼び出しのみが許可されていることを追加してください。 – Lol4t0

関連する問題