2013-01-03 83 views
1

我試圖刪除這個程序繼承char*屬性:如何刪除繼承的私人char *屬性? (例如:在析構函數)

在阿

class A {  
    public : 
    // Functions, constructors and such 
    private : 
    char* attribute; 
} 

在波黑

#include "A.h" 

class B : public A { 
    public : 
    B(const char* _attribute, int s) : A(_attribute) {setSpeed(s);} 
    ~B() 
    private : 
    int speed; 
} 

用delete []中析構如此:

B::~B() { 
    delete [] attribute; 
} 

但我得到這個錯誤:`字符* A ::屬性」是私人

在A的destuctor(~A())我用同樣的‘消滅[]屬性’和它的作品...

+1

因爲我從B創建了具有來自A的繼承屬性的對象並銷燬它,所以我使用了B的析構函數,因爲B中有其他屬性。 –

+0

請參閱'A(_attribute)''''對A?那應該告訴你一些關於誰的析構者應該負責銷燬所說的同樣的東西。我猜測它對A來說並不是私人的,特別是沒有理由。背後可能有原因。所以讓〜A()照顧它。它會被調用一次〜B()完成。 – WhozCraig

回答

6

由於它對A是私有的,因此A應該是負責刪除它的類。

你不應該在B中刪除它,這違反了基本的封裝。 B只應該注意刪除自己的屬性。

+0

那麼我應該怎樣從B調用A的析構函數呢? –

+2

@ user1944839,'A'的析構函數會自動在'B'後面調用。無論如何,考慮使用'std :: string'而不是'char *'。然後,沒有人必須清理後。 – chris

+0

@ user1944839否。當類的析構函數結束執行時,它會自動調用基類的析構函數(如果涉及多重繼承,它們都會自動調用它)。 – Angew

0

你的A類屬性定義爲私人的,所以它不會被B類繼承。它不存在於B類中。這就是爲什麼你不能刪除它。

嘗試使用受保護的。

0

您無法從派生類訪問基類的私有變量。如果您希望從派生類訪問它,則需要對其進行保護。