2

私は、基本クラスのげっ歯類を取り、それを純粋な抽象クラスにするように求める演習に取り組んでいます。純粋な抽象クラスについての私の理解は、それがインターフェースとして機能し、純粋な仮想関数のみを含むということです。これは簡単な演習ですが、本で提供されている解決策に問題があります。

class Rodent
{
    public:

    virtual ~Rodent() {cout << "Destroy rodent" << endl;}
    virtual void run() = 0;
    virtual void squeak() = 0;
};

ご覧のとおり、作成者はデストラクタにダミーの定義を追加しています。この定義の追加は、これが抽象クラスであり、「純粋な」抽象クラスではないことを意味しませんか?

4

6 に答える 6

6

Abstract クラスには、少なくとも 1 つの純粋仮想関数が含まれている必要があります。

あなたのクラスにはすでに 2 つの純粋仮想関数run()とがありsqueak()ます。したがって、これら 2 つの純粋仮想関数があるため、クラスは抽象です。

このクラスのオブジェクトは作成できません。

編集:

純粋抽象クラスは、純粋仮想関数のみを持つ (データを持たない) クラスです。デストラクタは純粋な仮想ではないため、クラスは純粋な抽象クラスではありません。

于 2011-09-28T15:52:02.927 に答える
3

C++ の規則により、すべてのクラスにデストラクタが必要です。指定しない場合は、コンパイラによって生成されます。

私の意見では、デストラクタは規則の例外であるため、これはまだ純粋な抽象クラスです。

于 2011-09-28T15:52:06.793 に答える
2

キーワードは、virtualデストラクタにとっては少し異なる意味を持ちます。基本クラスの dtor が仮想の場合、継承階層内のすべての dtor が呼び出されることを意味します。そのように実際にオーバーライドすることはできません。

通常、空であると予想されます。

class Rodent {
public:
  virtual ~Rodent() {}
  virtual void run() = 0;
  virtual void squeak() = 0;
};

違いはほとんどありません。空のボディはノーオペレーションであるため、コンパイラは言語弁護士法によってそれを無視できる可能性があります。

自分のことを純粋な仮想と呼んでも、だれかを混乱させるとは思いません。

于 2011-09-28T15:56:30.573 に答える
2

私の知る限り、C++ 標準は純粋な抽象クラスを指定していません。ただし、C++0x (n3290) では抽象クラスが指定されています。

10.4/2 純粋仮想関数が少なくとも 1 つある場合、そのクラスは抽象です。

純粋抽象クラスは従来の用語であり、次のような抽象クラスを表します。

  • 個のデータ メンバを持っていません
  • 非純粋仮想関数はありません
  • 具体的な機能を持たない

ユーザーが指定します。

したがって、この規則によれば、は純粋な抽象クラスclass Rodentではありません。

于 2011-09-28T16:00:41.720 に答える
2

そのようにインターフェースを実装することを検討してください

class Rodent {
public:
  virtual ~Rodent() = 0;
  virtual void run() = 0;
  virtual void squeak() = 0;
};
inline Rodent::~Rodent() {}

デストラクタを純粋な仮想として指定し、実装をインライン化すると、サブクラスをエクスポートするときに MSVC2010 で次の警告が回避されます。

warning C4275: non dll-interface class 'A' used as base for dll-interface class 'B'
于 2011-09-28T16:50:57.760 に答える
1

はい、もはや純粋なクラスではありません。純粋な抽象クラスには機能がなく、フレームワークを提供するだけです。cout は機能性です。

于 2011-09-28T15:55:16.847 に答える