C++ Не могу понять что происходит
Код:
class AA
{
public:
virtual ~AA()
{
}
protected:
virtual int Foo(int id) = 0;
};
class BB:public AA
{
public:
BB()
{
}
virtual ~BB()
{
}
virtual int Foo(int id)
{
return 0;
}
private: //если их убрать заработает
int* Top_;
int Lop_;
};
//а теперь использование
BB uu;
uu.Foo(32); //Все ок в люб случае
AA *arr = new BB[16];
BB &b = *((BB*)&arr[2]);
int val = b.Foo(32); //вылет в том случае если есть переменные Top Lop
{
public:
virtual ~AA()
{
}
protected:
virtual int Foo(int id) = 0;
};
class BB:public AA
{
public:
BB()
{
}
virtual ~BB()
{
}
virtual int Foo(int id)
{
return 0;
}
private: //если их убрать заработает
int* Top_;
int Lop_;
};
//а теперь использование
BB uu;
uu.Foo(32); //Все ок в люб случае
AA *arr = new BB[16];
BB &b = *((BB*)&arr[2]);
int val = b.Foo(32); //вылет в том случае если есть переменные Top Lop
Смотри отладчиком, какие поля неверное копируются при преобразовании.
Если дописать в класс BB новый метод, не вирт, он нормально отработает тут не в валидности тут нечто иное!
Код:
AA *arr = new BB[16];
Код:
BB *arr = new BB[16];
Код:
class BB:public AA
{
public:
BB()
{
Top_ = (int*)0x1;
Lop_ = 2;
}
virtual ~BB()
{
}
virtual int Foo(int id)
{
return 0;
}
private: //если их убрать заработает
int* Top_;
int Lop_;
};
{
public:
BB()
{
Top_ = (int*)0x1;
Lop_ = 2;
}
virtual ~BB()
{
}
virtual int Foo(int id)
{
return 0;
}
private: //если их убрать заработает
int* Top_;
int Lop_;
};
Не! Замен нельзя никаких делать. Должен именно быть базовый класс АА.
Ты спрашивал, почему происходит вылет и ничего не писал про то, как должно быть и что тебе вообще нужно.
Код:
AA *arr = new BB[16];
BB &b = *((BB*)&arr[2]);
BB &b = *((BB*)&arr[2]);
Тогда станет понятно, в чем причина. Компилятор пытается привести массив BB к массиву AA через RTTI, но это невозможно, поскольку тип массива BB не унаследован от типа массива AA. В результате генерируется исключение __non_rtti_object.
Решение - использовать контейнер, например std::vector. Он проведет четкую грань между массивом и указателем на объект.
Следующий код у меня работает:
Код:
std::vector<AA*> test;
for (size_t i=0; i<16; i++)
test.push_back(new BB());
BB *b = dynamic_cast<BB*>(test[2]);
std::cout << b->Foo(0) << std::endl;
for (size_t i=0; i<16; i++)
test.push_back(new BB());
BB *b = dynamic_cast<BB*>(test[2]);
std::cout << b->Foo(0) << std::endl;