1. ホーム
  2. c++

[解決済み] すべての仮想関数は派生クラスで実装する必要がありますか?

2022-10-24 08:37:21

質問

簡単な質問のようですが、どこにも答えが見当たりません。

次のようなものがあるとします。

class Abstract {
public:
    virtual void foo() = 0;
    virtual void bar();
}

class Derived : Abstract {
public:
    virtual void foo();
}

Derivedクラスがbar()関数を実装していないのは問題ないでしょうか? 派生クラスのすべてがbar()関数を必要としないが、いくつかは必要とする場合はどうでしょう。 抽象的な基底クラスのすべての仮想関数が派生クラスで実装される必要があるのでしょうか、それとも純粋な仮想関数だけなのでしょうか? ありがとうございます。

どのように解決するのですか?

派生クラスは ではなく を実装しなければなりません。 すべて 仮想関数を実装する必要があります。実装する必要があるのは 純粋な のものだけを実装すればよいのです。 1 ということは Derived のクラスは正しいということです。それは を継承しています。 bar の実装を祖先のクラスから継承します。 Abstract . (これは Abstract::bar はどこかで実装されているものとします。問題のコードではメソッドを宣言していますが、定義していません。インラインで定義するには トレンキさんの回答 が示すように、インラインで定義することもできますし、別々に定義することもできます)。


1 そしてその場合でも、派生クラスが インスタンス化される . 派生クラスが直接インスタンス化されず、より多くの派生クラスの基底クラスとしてのみ存在する場合、そのクラスは それら クラスのすべての純粋仮想メソッドを実装する責任があります。階層の中間に位置するクラスは、基底クラスと同様に、いくつかの純粋仮想メソッドを未実装のままにしておくことが許されています。もし、"middle" クラスが を実装している場合、その子孫はその実装を継承するので、彼ら自身がそれを再実装する必要はありません。