1

他のクラスが継承するクラスを C++ で作成したいと考えています。しかし、誰もこのクラスからインスタンスを作成できないようにしたいのです。

意味:

class Animal{
public:
virtual ~Animal() {}
};

class Fish: public Animal{
};

私はそれを確認したい:

Fish* fish = new Fish();

可能でしょうが、

Animal* ana = new Animal();

しません。

どうすればいいですか?

4

4 に答える 4

2

最も簡単な解決策は、Animalのコンストラクターを保護することです。

Class Animal{
protected:
    Animal() {}
public:
    virtual ~Animal() {}
};

C++ は抽象クラスの明示的なサポートを提供していないため、純粋仮想関数をクラスに追加して同様の効果を得ることができます。純粋仮想にしたい適切な仮想関数がない場合、一般的なイディオムは、デストラクタを純粋仮想にしてから、ヘッダーの外側に実装を提供することです。

Class Animal{
protected:
    Animal() {}
public:
    virtual ~Animal() = 0;
};

Animal::~Animal() {
    // destructor code
}
于 2012-05-03T12:54:11.690 に答える
2

抽象クラスを作成するための通常のイディオムは、純粋な仮想デストラクタを持つことです。

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

ピュアとしてマークされている場合でも、デストラクタの実装を提供する必要があることに注意してください。

A::~A()
{
}
于 2012-05-03T12:58:00.333 に答える
0

抽象クラスにする

于 2012-05-03T12:54:11.347 に答える
0

古い方法は、Animal のコンストラクターを保護することです。

C++11 の方法は、コンストラクターを削除済みとしてマークすることです。

于 2012-05-03T12:54:18.727 に答える