![]() |
От: |
Гарбузенко Алексей
|
http://bast.kiev.ua |
Дата: | 10.02.04 14:45 | ||
Оценка: |
Эволюция классов в C++
1. Мутация (Mutation)
1.1. Мутацией будем называть операцию замену объекта оного типа в памяти другим. Мутация в частичном виде существует в скриптовых языках высокого уровня (PHP, Perl) для простых типов в виде неявного преобразования строк, целых чисел, чисел с плавающей запятой и т.п.
1.2. Реализация мутации простых типов в C++ не реализуется без потери соответствия стандарту, поэтому рассматриваться здесь не будет.
1.3. Мутация классов в C++ реализуема при помощи оператора placement new.
1.4. Правила и ограничения мутации
1.4.1. Мутация классов в стеке возможна в том случае, если объем нового объекта не превышает объем исходного.
1.4.2. Мутация классов в динамической памяти возможна в том случае, если объем нового объекта не превышает объем памяти, выделенной для старого объекта.
1.4.3. Использование регулярных и статических методов нового типа, так же как и обращение к публичным переменным результата мутации правомочно лишь в случае явного приведения этого объекта к новому типу.
1.4.4. Использование регулярных и статических методов старого типа, так же как и обращение к его переменным по отношению к результату мутации не допустимо и приводит к неопределенному поведению.
1.4.5. Использование виртуальных методов, одинаковых по описанию и порядковому номеру в виртуальной таблице допустимо без приведений.
1.5. Разрешенной будем считать мутацию, условия проведения и использования которой не противоречат пунктам 1.5.1. — 1.5.5.
2. Эволюция (Evolution)
2.1. Частный случай разрешенной мутации, операндами которой являются объекты, имеющие общий предок или наследуемые один от другого, будем называть эволюцией.
2.2. Эволюцию, в ходе которой данные, содержащиеся в исходном объекте, теряются, будем считать деструктивной.
Пример:
#include <new.h> #include <iostream> class Base{ public: virtual ~Base () {}; virtual void Ident()=0; }; class Derived1: public Base { public: Derived1():data(1) {}; virtual ~Derived1 () {}; virtual void Ident() { cout<<"Derived1"<<endl; } int data; }; class Derived2: public Base { public: Derived2():dat(2){}; virtual ~Derived2 () {}; virtual void Ident() { cout<<"Derived2"<<endl; } int dat; }; int main () { Base * object=new Derived1(); object->Ident(); object->~Base(); object=new(object) Derived2(); object->Ident(); delete object; }
2.3. Эволюцию, в ходе которой все данные исходного объекта или их часть сохраняется в новом, будем считать конструктивной.
Пример:
#include <new.h> #include <iostream> class Base{ public: virtual ~Base () {}; virtual void Ident()=0; virtual int getData()=0; virtual void setData(int)=0; }; class Derived1: public Base { public: Derived1():data(1) {}; virtual ~Derived1 () {}; virtual void Ident() { cout<<"Derived1, data: "<<data<<endl; } virtual int getData() { return data; } virtual void setData(int Data) { data=Data; } private: int data; }; class Derived2: public Base { public: Derived2():dat(2){}; virtual ~Derived2 () {}; virtual void Ident() { cout<<"Derived2, dat: "<<dat<<endl; } virtual int getData() { return dat; } virtual void setData(int Data) { dat=Data; } private: int dat; }; int main () { Base * object=new Derived1(); object->Ident(); int temp=object->getData(); object->~Base(); object=new(object) Derived2(); object->setData(temp); object->Ident(); delete object; }
....