class A{
public:
virtual ~A()=0;
};
class B:public A{
int *i;
public:
~B() {delete i;}
};
int main(){
B* temp = new B;
}
我只是想有B時A的執行出於某種原因,我不能這樣做這個。
class A{
public:
virtual ~A()=0;
};
class B:public A{
int *i;
public:
~B() {delete i;}
};
int main(){
B* temp = new B;
}
我只是想有B時A的執行出於某種原因,我不能這樣做這個。
在C++中的析構函數可以是純虛:
class A{
public:
virtual ~A()=0;
};
但在任何情況下,它需要被實現:
inline A::~A() {}
否則A不是可用類。我的意思是破壞派生(S/B)是不可能的。並且需要破壞的可能性,在這條線:
B* temp = new B;
因爲在扔異常的情況下 - 編譯器會自動自毀溫度...
在頭文件中提供虛擬析構函數的內聯空實現。沒有其他辦法。否則,派生(S/B)的破壞是不可能的。 – PiotrNycz
感謝添加該行固定我的程序。 – user1202422
我不認爲帶'B'的行實際上可以調用任何析構函數,因爲如果'new'在完成'B'構造之前拋出它(實際上在啓動它之前;它無法獲得原始內存) ,所以析構函數'B ::〜B'不會被調用。但是這個(調用'B'構造函數的行)和編譯器一樣可以發現警告你不可能破壞'B';要麼你會最終做到這一點,或者你有內存泄漏。 –
根據您的評論"Yeah i want A to basically be just a container class. Do not want any implementation of A"
。 您的B類應繼承protected/private
而不是public
繼承。 virtual ~A()
允許爲pure
,但您仍然需要向~A()
提供實施。
class A{
public:
virtual ~A() = 0
{
cout << "~A"<<endl;
}
};
class B : private /*protected*/ A{
int *i;
public:
B() : A(){
i = new int;
}
~B() {
delete i;
}
};
int main(){
B* temp = new B;
delete temp;
return 0;
}
B和S之間的關係是什麼? – billz
哦對不起,忘了改變這一點。 – user1202422
請注意,現在,您的'B ::〜B'具有未定義的行爲 - 它會刪除'i',但'i'從未初始化。 –