2017-02-09 8 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
あなたが作成されたなかった何

とタイプBのクラスB.ポインタから派生したクラスDのオブジェクトを、そのアドレスは、 "クラスDのB部分"を指示する命令を有するポインタである。作成されたオブジェクトはまだクラスDであり、クラスDのポインタにキャストできます。

また、これは、現在のスコープ内のDクラスの機能の使用を制限またはすべて同じ基本クラスから派生しなければならない異なるタイプのオブジェクトのリストを作成する方法である(典型的な例dogcatクラスがanimalクラスを拡張しています両方ともpets<animal>リストに入れます)

関連する問題