2

C++ で基本クラスを抽象として明示的に宣言する方法はありますか?

クラスを抽象として暗黙的に宣言する純粋仮想関数をクラスに作成できることを知っています。ただし、派生クラスで定義するためだけにダミー関数を作成する必要はありません。

コンストラクターを保護することもできます。これにより、オブジェクトのインスタンス化が妨げられますが、実際にはクラスが抽象としてマークされません。

それで、これを行う方法はありますか?(これを行う方法が追加された場合、私はC++ 11を使用していますが、適切に見えるものは何も見つかりませんでした)

4

3 に答える 3

3

デストラクタを純粋仮想にすることができます。常にデストラクタが必要なため、追加の精神的コストはありません。

struct Foo
{
    virtual ~Foo() = 0;
};

inline Foo::~Foo() { }

(もちろん、デストラクタの実装が必要なので、アウトオブラインを提供する必要があります。)

protectedこれは、「リーフ以外のクラスを抽象化する」ルールに従うことをお勧めします。

例:

struct Bar : Foo  { };

// Foo f;  // Error, Foo is abstract
Bar b;     // OK
于 2012-11-14T02:22:42.530 に答える
1

私はケレックの答えが好きです。そうすれば、クラスをインスタンス化できないため、抽象化されます。

ただし、クラスの宣言全体に目を通し、デストラクタが仮想であることを確認しない限り、クラスが抽象であることは明らかではありません。

私が持っていた別のアイデアは、を使用して「抽象」という単語のプリプロセッサ定義を作成できることです#define。このようにして、次のようなことができます。

abstract struct Foo {};

それは

struct Foo {};

これで私が目にする問題は、これがクラスを抽象化することを強制しないため、マクロを使用して仮想デストラクタも宣言できることです。何かのようなもの:

#define ABSTRACT_CLASS(class_name) \
  class class_name { \
    virtual ~class_name() = 0; //

そして、次のように使用します。

ABSTRACT_CLASS(Foo) {
  // class declaration
};

これは次のようになります。

class foo {
  virtual ~class_name() = 0; // {
  // class declaration
};

免責事項: 私のマクロは少しずれている可能性があります。~ と () が変数名に触れている class_name を実際に貼り付けるかどうかはわかりません。また、これを自分で行うかどうかはわかりません。特にブレースをコメントアウトすることは、次の行に配置すると機能しないため、最も美しいソリューションではありません。しかし、あなたは何かを抽象としてマークする方法を尋ねたので、私はそれをあなたに与えました!

于 2012-11-14T02:30:16.637 に答える
0

C++ で基本クラスを抽象として明示的に宣言する方法はありますか?

いいえ、ありません。クラスは、少なくとも 1 つの抽象メソッドが宣言されている場合にのみ抽象です。基本クラスを直接インスタンス化したくない場合は、保護されたコンストラクターが適切な選択です。

于 2012-11-14T02:25:08.487 に答える