Имеются два класса:
class base
{
public:
int counter;
};
class inherit:public base
{
public:
AnsiString row;
};
Есть функция, которая должна работать с класcом base, и не должна знать о существовании класса inherit. При этом она может выделять память экземпляру класса.
void doSomeWithBase(base *a)
{
a=new base;
a->counter=0;
}
Программа работает с экземплярами типа inherit, к примеру, так:
void doSomeWithInherit(inherit *a)
{
if (a->counter)
ShowMessage(a->row);
}
Нужно реализовать следующую возможность:
base *simple;
inherit *complex;
doSomeWithBase(simple);
//expand simple to complex, for example:
complex=(inherit*)simple; //wrong!
doSomeWithInherit(complex);
Понятно что память выделяется только по размеру base, и при попытке использовать методы/изменить свойства inherit получается Access Violation.
Выделять память вне функции doSomeWithBase нежелательно, так как программа не знает, сколько экземпляров создаст функция.
Есть решение
base *simple;
inherit *complex;
doSomeWithBase(simple);
complex=new inherit;
complex=simple;
doSomeWithInherit(complex);
которое опять же нежелательно, поскольку размер base может быть довольно большим.
Возможно ли расширить базовый клас к наследованному, не применяя копирование?