删除动态分配的派生对象 - 多态性

时间:2015-07-08 21:14:13

标签: c++ polymorphism subclass

我无法弄清楚如何通过basepointer删除动态分配的子类。分配在App-class中,如何使用main方法删除已分配的对象?

#include <iostream>

using namespace std;

class Base {

public:
   virtual void print() = 0;
   virtual ~Base() {
      cout << "Base destructor\n";
   }
};

class Sub1 : public Base {

public:
   void print() {
      cout << "I am Sub1!\n";
   }
   ~Sub1() {
       cout << "Sub1 destructor\n";
   }
};

class Sub2 : public Base {

public:
   void print() {
      cout << "I am Sub2!\n";
   }
   ~Sub2() {
       cout << "Sub2 destructor\n";
   }
};

class App {

public: 
   App(Base *&b) {
      b = new Sub1;
      b = new Sub2;
   }
};


int main() {

   Base *b;
   b = NULL;

   App app(b);


 return 0;
 }

1 个答案:

答案 0 :(得分:2)

泄密的最低限度是:

class App {

public: 
   App(Base *&b) {
      b = new Sub1;
      delete b;      // This is your only chance since the next statement overwrites the pointer.
      b = new Sub2;
   }
};


int main() {

   Base *b;
   b = NULL;

   App app(b);

   delete b;

   return 0;
}

但这似乎不是一个非常明智的计划。你真的需要弄清楚你想要用Sub1和Sub2做什么。你不能让一个指针同时指向两个独立的对象。

此外,你最好学习使用std :: unique_ptr,因为它保留了它指向的所有权,因此在适当的时候删除它。

因此,使用std :: unique_ptr对代码的最小更改是:

class App {

public: 
   App(std::unique_ptr<Base> & b) {
      b.reset(new Sub1);
      b.reset(new Sub2);
   }
};


int main() {

   std::unique_ptr<Base> b;

   App app(b);

   return 0;
}

没有手动删除语句。而且没有内存泄漏。

(可能无用的Sub1问题仍然存在,但这是一个你必须弄清楚的设计问题,因为我不知道你希望你的程序最终实际做什么。)