Ромбовидное наследование
От: Small  
Дата: 18.12.03 08:30
Оценка:
Сразу прошу прощения если этот вопрос уже задавался.

Объявляем интерфейс IA
class IA
{
public:
    virtual void f() = 0;
};


Объявляем расширенную версию интерфейса IA — интерфейс IB
class IB : public virtual IA
{
public:
    virtual void g() = 0;
};


Реализуем в классе A интерфейс IA
class A : public virtual IA
{
public:
    virtual void f()
    {
        printf("A::f");
    }
};


А теперь хотим реализовать интерфейс IB в классе B, воспользовавшись уже имеющейся реализацией f из A
class B : public IB, public A
{
public:
    virtual void g()
    {
        printf("B::g");
    }
};



На все это счастие .NET 2003 выдает предупреждение:
warning C4250: 'B' : inherits 'A::A::f' via dominance see declaration of 'A::f'

Хочется от него избавиться. Делегирование не предлагать
Re: Ромбовидное наследование
От: Kluev  
Дата: 18.12.03 08:52
Оценка:
Здравствуйте, Small, Вы писали:

S>На все это счастие .NET 2003 выдает предупреждение:

S>warning C4250: 'B' : inherits 'A::A::f' via dominance see declaration of 'A::f'

S>Хочется от него избавиться. Делегирование не предлагать


#pragma warning ( disable : 4250 )
Re: Ромбовидное наследование
От: Kluev  
Дата: 18.12.03 08:54
Оценка:
Здравствуйте, Small, Вы писали:

S>На все это счастие .NET 2003 выдает предупреждение:

S>warning C4250: 'B' : inherits 'A::A::f' via dominance see declaration of 'A::f'

S>Хочется от него избавиться. Делегирование не предлагать


VC++ склонен к тому чтобы засыпать юзера варнингами, но варнинги это не ошибки, если знаешь что делаешь, то забудь о них.
Re[2]: Ромбовидное наследование
От: Small  
Дата: 18.12.03 08:54
Оценка:
K>#pragma warning ( disable : 4250 )
Конечно это самое простое решение. Хотелось бы избавиться от проблемы в принципе
Re[3]: Ромбовидное наследование
От: Аноним  
Дата: 18.12.03 09:04
Оценка:
Здравствуйте, Small, Вы писали:

K>>#pragma warning ( disable : 4250 )

S>Конечно это самое простое решение. Хотелось бы избавиться от проблемы в принципе

Проблемы нет. Всё верно. Это informational warning, который можно и нужно давить.
Re: Ромбовидное наследование
От: co  
Дата: 18.12.03 09:31
Оценка:
Так не пойдет ?


class B : public IB, public A
{
public:
    virtual void g()
    {
        printf("B::g");
    }
    virtual void f()
    {
        A::f();
    }
};
Re[2]: Ромбовидное наследование
От: Small  
Дата: 18.12.03 09:48
Оценка:
Здравствуйте, co, Вы писали:

co>Так не пойдет ?


co>

co>class B : public IB, public A
co>{
co>public:
co>    virtual void g()
co>    {
co>        printf("B::g");
co>    }
co>    virtual void f()
co>    {
co>        A::f();
co>    }
co>};

co>


Принципиально не отличается в этом случае от делигирования. У меня много методов и это крайне не удобно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.