以下是代码的格式:
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 :(得分: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
class C{
public:
C() {}
virtual ~C() {}
};
C* c = new C(); // this is ok