1

GNU コンパイラを使用しています。クラス B の仮想デストラクタは、デストラクタ ~D() を呼び出しません。誰か教えてくれませんか?

#include<iostream>
using namespace std;

class B {
  double* pd;
  public:
  B() {
  pd=new double [20];
  cout<< "20 doubles allocated\n";
  }

  virtual ~B() {   //the virtual destructor is not calling ~D()
  delete[] pd;
  cout<<"20 doubles deleted\n";
  }

  };

class D: public B {
  int* pi;
  public:
  D():B() {
  pi= new int [1000];
  cout<< "1000 ints allocated\n";
  }
  ~D() {
  delete[] pi;
  cout< "1000 ints deleted\n";
  }
  };

int main() {
  B* p= new D; //new constructs a D object

Delete はクラス B で仮想デストラクタを呼び出す必要がありますが、そうではありません。

  delete p; 
  }
4

1 に答える 1

8

タイプミスがあるため、出力が表示されないだけです。

cout < "1000 ints deleted\n";
//   ^, less than

あなたのコンパイラは寛大すぎます。これはコンパイルできません (少なくとも C++11 では)。

これはおそらくbasic_ios::operator void*、ストリーム オブジェクトを暗黙的に に変換可能にvoid*し、コンパイラが文字列リテラルを に減衰させることを許可しているためchar*です (これは に変換可能void*です)。cout < "x";次に、組み込みを使用してポインター比較をoperator<(void*, void*)行い、結果を破棄します。

于 2013-08-05T10:39:14.373 に答える