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只要您不尝试实例化它,您就可以完全“按原样”保留它(即您只创建Ds,但您可以将它们作为Cs.

于 2012-12-13T04:08:46.630 回答
4

“=0”表示您将此方法定义为纯虚拟方法。如果一个类包含任何纯虚拟方法,则该类是纯虚拟的。您不能实例化纯虚拟类,因为没有纯虚拟方法的实现。

于 2012-12-13T04:07:54.523 回答
2

C 类在 C++ 中调用abstract class,但无法初始化。

§10.4/2 抽象类 抽象类是只能用作某个其他类的基类的类;抽象类的任何对象都不能被创建,除非是从它派生的类的子对象。如果一个类至少有一个纯虚函数,那么它就是抽象的。

更改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 回答