如何实现纯虚拟析构函数?

时间:2012-12-13 04:05:11

标签: c++ abstract-class instantiation pure-virtual

以下是代码的格式:

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

我知道我无法调用虚拟析构函数,但在概念上有一些我不知道的东西。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:5)

您无法实例化C,因为您明确表示它的析构函数未定义。

你可以这样做:

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

代替。

只要您不尝试实例化{{1>},就可以将C保持原样“(即您只创建D s,但您可以将其作为C传递}第

答案 1 :(得分:4)

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

答案 2 :(得分:2)

C类在C ++中称为abstract class,无法初始化。

  

§10.4/ 2抽象类抽象类是可以使用的类   仅作为其他类的基类;没有抽象的对象   除了作为派生自它的类的子对象之外,可以创建类。   如果一个类至少有一个纯虚函数,那么它就是抽象的。

C *c = new C();更改为C *c = new D();应该有效。

或者您可以通过删除=0

来使C类非抽象类
class C{
public:
  C() {}
  virtual ~C() {}
};

C* c = new C();  // this is ok