0

C++ の世界に戻り、インターフェイスを試します。多くのオンラインの例を見つけることができますが、それらの 99% は些細な「オールインワン ファイル」です。

インターフェイスは 3 つの基本的なタイプに分類できます。インターフェイスでは、(all|some|zero) 関数を具体的なサブクラスでオーバーライドする必要があります (c++ の用語では all|some|zero 純粋仮想関数)。

単一のヘッダー ファイルに 3 つのいずれかを実装することは可能ですか? (ない .cpp ツイン) なぜ/なぜ? どのように?そうでない場合、.h/.cpp ペアのオプションは何ですか?

私が見たオプションのいくつかは次のとおりです: 仮想デストラクタ、保護されたデストラクタ、インライン デストラクタ、実装を伴う純粋な仮想デストラクタ、... 頭が回転しています!

編集:仮想ボイドではなく、純粋な仮想を意味しました

4

3 に答える 3

1
  • インターフェイスを純粋仮想にすると、具体的なクラスにメソッドを実装するのを忘れると、コンパイラはエラーを出します。
  • 正常なデフォルト実装を持つメソッドがある場合は、それを提供できますが、これは単なる便利です。
  • デストラクタを仮想化するdeleteと、具体的なオブジェクト ポインタを必要とするのではなく、インターフェイス ポインタを介してオブジェクトを取得できます。

Herb Sutter は、インターフェースについて、私たちのほとんどがインターフェースを実装する方法とは正反対の興味深い考えをいくつか持っています: http://www.gotw.ca/publications/mill18.htm

于 2012-08-09T20:16:01.530 に答える
0

具象サブクラスによってすべての関数をオーバーライドする必要があるインターフェイスが呼び出されますinterface

具体的なサブクラスによって一部の関数をオーバーライドする必要があるインターフェイスが呼び出されますabstract class

具象サブクラスによってゼロ関数をオーバーライドする必要があるインターフェイスが呼び出されclassます。

ヘッダー ファイル内に仮想メンバー関数を実装できます。ただし、仮想テーブルに配置するアドレスが必要なため、インライン化されません。

... 私の頭がクラクラします!

さらに回転させるには、 も使用できますpure virtual destructor。これは、抽象クラスが必要な場合に便利なトリックですが、純粋な仮想を配置するための実際に役立つメソッドはありません。

class A
{
public:
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
public:
    ~B() {}
};

クラス A にはデストラクタが実装されていますが、インターフェイスであるため直接インスタンス化することはできません。それでも、コンパイラを破棄する場合はB、プロトコルに従って ~A() を呼び出す必要があります。だからこそ実装する必要がある

于 2012-08-09T20:19:22.950 に答える
0

この素晴らしいインターネットの知恵を読んでください: http://www.parashift.com/c++-faq-lite/dtors.html

1) .cpp ファイルは必要ありません。すべてのプログラムを .h でコーディングできますが、これを行うとスタイルが悪く、必然的にコンパイルが遅くなります。

MyClass : public MyInterface {
    public:
    virtual void myFunction() {
        // override and implemenht
    }
};

2) クラスを継承するとき、デストラクタを仮想として宣言することを心配する必要はありませんが、継承元のクラスに仮想デストラクタがあることを確認する必要があります。そうしないと、メモリ リークが発生する可能性があります。私の知る限り、これは純粋仮想関数のみを持つインターフェイス クラスには必要ありません。

デストラクタがインラインであっても、違いはありません。

デストラクタが void として宣言されていると、コンパイラ エラーが発生するはずです :)。

編集: 3 種類のインターフェイスについて、少し混乱しているように感じます。これがグーグル検索の妨げになっています。

インターフェイスは通常、関数が定義されていないクラスであり、それらすべてを継承して実装する必要があります。

いくつかの機能を持ちながら、いくつかの純粋な仮想も持つクラスは、通常抽象と呼ばれます。

「ゼロ」関数をオーバーライドする必要がある場合、これはインターフェイスでも抽象クラスでもなく、継承して何でもできる単純な古いクラスです。

C++ FAQ を確認してください。

于 2012-08-09T20:10:38.673 に答える