これは簡単な質問のように思えるかもしれませんが、私はどこでも答えを見つけることができません。すべての仮想関数は派生クラスで実装する必要がありますか?
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
はそれが派生クラスがバー()関数を実装していないことをOKです:
は、私は、次のしていると仮定しますか? 派生したすべてのクラスにbar()関数が必要なわけではありませんが、いくつかはそうです。 抽象基本クラスのすべての仮想関数は、派生クラス内に実装する必要がありますか、純粋仮想クラスだけを実装する必要がありますか? おかげ
(純粋な仮想関数の実装)もインスタンス化を意図している場合のみ(抽象基本クラス自体とは対照的に)。 –
それは私が思ったものです。しかし私のプロジェクトでこれをやっていると、Derived :: bar()の "未解決の外部シンボル"があるというリンクエラーが発生しています。しかし、私はDerivedの中でbarを宣言したことはありませんでした。なぜリンカーは関数本体を探していますか? – mikestaub
@pixelpusherもちろん 'Derived :: bar'は' Abstract :: bar'の関数本体を持っています。つまり、それが定義されている翻訳単位(どこにでも定義されていますか?)は、それが呼び出される翻訳単位にリンクされていないようです。 –