//Stack.h#ifndef STACK_H#define STACK_H#include "ObjectsHierarchy.h"class Stack{ struct Node{ Object* data; Node* next; Node(Object* _data, Node* _next): data(_data), next(_next){} }* top;public: Stack():top(0){} ~Stack(){ //контейнер Stack не является владельцем объектов типа Object - за их создание и удаление //отвечает код, использующий экземпляр класса Stack. Удаляются только узлы Node while(top) pop(); } void push(Object* _data){ top = new Node(_data, top); } Object* peek() const{ return (top ? top->data : 0); } Object* pop(){ if(top == 0) return 0; Object* result = top->data; Node* oldTop = top; top = top->next; delete oldTop; return result; }};#endif //STACK_H//ObjectsHierarchy.h#ifndef OBJECT_HIERARCHY_H#define OBJECT_HIERARCHY_H#include <iostream>typedef unsigned char byte;typedef unsigned int uint;const unsigned int default_size = 100;class Object{public: Object(){} virtual ~Object(){ std::cout<< "Object destructor" << std::endl; } virtual char* presentation() = 0;};class Derived1: public Object{ byte *m_data;public: Derived1(uint size = default_size): Object(){ m_data = new byte[size]; } virtual ~Derived1(){ delete []m_data; std::cout << "Derived1 destructor" << std::endl; } char* presentation(){return "I'm class Derived1";} static Derived1* create(uint size = default_size){ return new Derived1(size); } void remove(){ delete this; }};class Derived2: public Object{ byte *m_data;public: Derived2(uint size = default_size): Object(){ m_data = new byte[size]; } virtual ~Derived2(){ delete []m_data; std::cout << "Derived2 destructor" << std::endl; } char* presentation(){return "I'm class Derived2";} static Derived2* create(uint size = default_size){ return new Derived2(size); } void remove(){ delete this; }};#endif //OBJECT_HIERARCHY_H//main.cpp#include <iostream>#include "Stack.h"#include "ObjectsHierarchy.h"int main(){ Stack st; //заполняем контейнер разнородными объектами for(uint i = 0; i < 5; i++){ st.push(Derived1::create(i*10)); } for(uint i = 5; i < 10; i++){ st.push(Derived2::create(i*10)); } st.push(new Derived1(1000));//до кучи Object* p = 0; while(p = st.pop()){ //унифицированно работаем с объектами через их общий интерфейс std::cout << p->presentation() << std::endl; //удаляем больше не нужные объекты delete p;//работает виртуальный деструктор } return 0;}