2017-02-09 62 views
1

我是C++中的新手。我正在學習C++ oops概念。 是否允許使用派生類(D)分配基類(B)指針的內存?使用派生類分配基類指針的內存

B *a = new D(); 

我的代碼:

#include <iostream> 
using namespace std; 

class B 
{ 
public: 
     B() 
     { 
       cout<<"B constructor"<<endl; 
     } 

     ~B() 
     { 
       cout<<"B Destroctur"<<endl; 
     } 
}; 

class D : public B 
{ 
public: 
     D() 
     { 
       cout<<"D constructor"<<endl; 
     } 

     ~D() 
     { 
       cout<<"D Destroctur"<<endl; 
     } 
}; 

int main() 
{ 
     B *a = new D(); 
     delete a; // Is valid? 
} 

而且,它是有效的釋放基類指針的內存?

delete a; 
+0

http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors – SingerOfTheFall

+0

有作爲「基類指針的記憶」沒有這樣的事。 – immibis

+0

這是一個開始學習基礎知識的好地方:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – user2079303

回答

4

它是有效的,只要你申報的基礎析構虛:

virtual ~B() { /*B destructot code*/} 
+1

爲什麼你需要將基礎知識作爲「虛擬」 ,請參閱[這裏](http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors) – sameerkn

1

你是被創造什麼和d類的對象,它是從B類指針派生類型B的地址創建對象被分配給的是指針,其指令指向「B部分D類」。創建的對象仍然是D類,可以轉換爲D類指針。

這也是限制d類官能團的使用在一個當前範圍或創建具有不同類型的對象,其必須全部由相同的基類派生的列表(典型的例子是dogcat類延伸animal類的方式並且都放在pets<animal>列表)

相關問題