Всем добрый день
Есть два базовых класса:
#include <iostream>
#include <list>
using namespace std;
//первый базовый класс
class A
{
public:
void foo1() { cout << "A::foo1" << endl; }
};
//второй абстрактный базовый класс
class B
{
public:
virtual void foo2() = 0;
};
//два производных класса
class C1: public A, public B
{
public:
void foo2() { cout << "C1::foo2" << endl; }
};
class C2: public A, public B
{
public:
void foo2() { cout << "C2::foo2" << endl; }
};
//используем следующим образом
int main()
{
list<A*> lst;
lst.push_back(new C1());
lst.push_back(new C2());
for(list<A*>::iterator it = lst.begin(); it != lst.end(); ++it)
{
B* b = (B*)(*it);
b->foo2(); // здесь падает
}
//...
return 0;
}
На выделенном фрагменте программа падает. Если же делать так:
class C1: public A, virtual public B
{
public:
void foo2() { cout << "C1::foo2" << endl; }
};
class C2: public A, virtual public B
{
public:
void foo2() { cout << "C2::foo2" << endl; }
};
то все нормально отрабатывает. Что за поведение такое и правомерно ли указанное решение проблемы ? Может кто-нибудь прокомментировать