0

コードの形式は次のとおりです。

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

class D : public C
{
public:
    D();
    ~D();
};

C::C(){
}

C::~C(){
}

D::D(){
}

D::~D(){
}

int main(){
    C *c = new C();
    D *d = new D();
    return 0;
}

インスタンス化しようとするcと、次のエラーが発生します。

1>c:\main.cpp(59): error C2259: 'C' : cannot instantiate abstract class

仮想デストラクタとは呼べないことは知っていますが、その概念についてはひどくわからないことがあります。誰かが私を説明できますか?

4

3 に答える 3

5

Cデストラクタが未定義であると明示的に言ったため、インスタンス化できません。

あなたはただすることができます:

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

代わりは。

Cインスタンス化を試みない限り、正確に「そのまま」のままにすることができます(つまりD、sを作成するだけですが、sとして渡すことができますC

于 2012-12-13T04:08:46.630 に答える
4

「=0」は、このメソッドを純粋な仮想として定義することを意味します。クラスに純粋な仮想メソッドが含まれている場合、そのクラスは純粋な仮想です。純粋仮想メソッドの実装がないため、純粋仮想クラスをインスタンス化することはできません。

于 2012-12-13T04:07:54.523 に答える
2

クラスCはabstract class初期化できないC++で呼び出されます。

§10.4/2抽象クラス抽象クラスは、他のクラスの基本クラスとしてのみ使用できるクラスです。抽象クラスのオブジェクトは、それから派生したクラスのサブオブジェクトを除いて作成できません。クラスに少なくとも1つの純粋仮想関数がある場合、そのクラスは抽象です。

に変更C *c = new C();すると機能するC *c = new D();はずです。

または、削除することでクラスCを非抽象クラスにすることができます=0

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

C* c = new C();  // this is ok
于 2012-12-13T04:12:58.693 に答える