непонятки с множественным наследованием
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 25.03.05 14:56
Оценка:
Всем добрый день

Есть два базовых класса:

#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; }
};

то все нормально отрабатывает. Что за поведение такое и правомерно ли указанное решение проблемы ? Может кто-нибудь прокомментировать
"Что не завершено, не сделано вовсе" Гаусс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.