C++ 如何实现纯虚拟析构函数?
以下是代码的格式:C++ 如何实现纯虚拟析构函数?,c++,abstract-class,instantiation,pure-virtual,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
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
我知道我不能调用虚拟析构函数,但是在概念上有一些我不知道的东西。有人能解释一下吗?“=0”表示您将此方法定义为纯虚拟方法。如果类包含任何纯虚拟方法,则该类是纯虚拟的。您不能实例化纯虚拟类,因为没有纯虚拟方法的实现。您不能实例化
C
,因为您已经明确表示它的析构函数未定义
你可以这样做:
class C
{
public:
C();
virtual ~C() {}
};
相反
只要你不尝试实例化它,你就可以离开<代码> C <代码>,即你只创建<代码> d>代码> s,但是你可以把它们作为“<代码> C <代码> > S.< /P> < P> > C类,在C++中被称为“代码>抽象类< /代码>,不能初始化。
§10.4/2抽象类抽象类是指可以使用的类 仅作为其他类的基类;没有抽象对象 类可以创建,但作为从其派生的类的子对象除外。 如果一个类至少有一个纯虚函数,那么它就是抽象的 将C*C=new C();
更改为C*C=new D();
应该可以工作
或者您可以通过删除=0
class C{
public:
C() {}
virtual ~C() {}
};
C* c = new C(); // this is ok
你不能实例化一个有纯虚方法的类。如果你想实例化
C
,你不应该有任何纯函数。你确定你需要你的析构函数是纯函数吗?可能是@chris的副本,我知道。如果我有纯虚析构函数呢?如何解决上述问题?@Ashwinkumar:问题是t你们两个(1)在你们的类中有一个纯虚拟析构函数,(2)正在尝试实例化该类。这可以通过(1)在你们的类中没有纯虚拟析构函数或(2)不尝试实例化它来解决。这解释了我的问题。谢谢+1。添加了段落号以减少标准参考位置的歧义。