2012-12-13 72 views
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 

我知道我不能調用虛擬析構函數,但也有一些是可怕的我不瞭解這些概念。有人能解釋我嗎?

+3

您不能實例化一個具有純虛擬方法的類。 –

+1

如果你想實例化'C',你不應該有任何純函數。你確定你需要你的析構函數是純粹的嗎? – chris

+0

可能的重複http://stackoverflow.com/questions/630950/pure-virtual-destructor-in-c?rq=1 –

回答

5

你不能實例化C,因爲你明確地說它的析構函數是未定義的。

你可能只是做:

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

代替。

您可以留下C正是「原樣」只要你不嘗試進行實例化(即你只能創建D S,但你可以通過他們周圍爲C秒。

+0

謝謝..問題解決了。但只能接受一個答案! –

4

「= 0」表示您將此方法定義爲純虛擬方法。如果一個類包含任何純虛擬方法,那麼這個類就是純虛擬的。您不能實例化純虛擬類,因爲純虛擬方法沒有實現。

+0

這解釋了我的問題。謝謝 –

2

C類被稱爲abstract class在C++中不能被初始化。

§10.4/2 Abstract classes An abstract class is a class that can be used only as a base class of some other class; no objects of an abstract class can be created except as subobjects of a class derived from it. A class is abstract if it has at least one pure virtual function.

變化C *c = new C();C *c = new D();應該工作。

也可以使C類非abstrac t class by =0

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

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

+1。添加了段落號碼以減少標準參考位置的歧義。 –