Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ромбовидное наследование и VC++ 
V
    Опции темы
Cheloveck
Дата 24.11.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Есть код, наподобие этого
Код

#include <iostream>

class IBase
{
public:
    virtual void one() = 0;
};

class CBase :
    public virtual IBase
{
public:
    virtual void one()
    {
        std::cout << "one\n";
    }
};

class IDerived :
    public virtual IBase
{
public:
    virtual void two() = 0;
};

class CDerived :
    public IDerived,
    public CBase
{
public:
    virtual void two()
    {
        std::cout << "two\n";
    }
};

int main()
{
    CDerived d;
    d.one();
    d.two();
    return 0;
}

Деструкторы, для наглядности, опустим.
Так вот, VC++ 2008 говорит
Цитата

Warning    1    warning C4250: 'CDerived' : inherits 'CBase::CBase::one' via dominance    e:\projects\temps\temp\main.cpp    35

http://msdn.microsoft.com/ru-ru/library/6b3sy7ae(VS.90).aspx
Но вот g++ ни чего не говорит, даже с опцией -Wall.
Такой вопрос, можно ли задисейблить этот ворнинг? Ведь в коде нет никаких неоднозначностей.


--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 24.11.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Cheloveck @  24.11.2010,  17:30 Найти цитируемый пост)
Такой вопрос, можно ли задисейблить этот ворнинг?
Можно, по вашей же ссылке написано:
Цитата

Для отключения предупреждения C4250 используйте директиву pragma warning.
Или прописать virtual void one() во всех наследниках


PM MAIL   Вверх
Cheloveck
Дата 24.11.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(xvr @  24.11.2010,  17:56 Найти цитируемый пост)
 по вашей же ссылке написано:
Цитата

Для отключения предупреждения C4250 используйте директиву pragma warning.

Ну, можно-то любой ворнинг так отключить. Меня интересуют последствия, грабли, подводные камни...



--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 24.11.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Cheloveck @  24.11.2010,  18:22 Найти цитируемый пост)
Меня интересуют последствия, грабли, подводные камни...
Последствий никаких (если вы это так и задумывали)


PM MAIL   Вверх
mes
Дата 24.11.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Cheloveck, а действительно ли нужно ромбовидное наследование ?
если для того, чтоб уменьшить кол-во написанного кода, и при этом нужна иерархия интерфейсов, можно попросить помощи у шаблонов..

Добавлено через 2 минуты
в любом случае ромбовидное наследование в первую очередь говорит о  неправильной архитектуре приложения.. 



--------------------
PM MAIL WWW   Вверх
Cheloveck
Дата 24.11.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(mes @  24.11.2010,  18:49 Найти цитируемый пост)
в любом случае ромбовидное наследование в первую очередь говорит о  неправильной архитектуре приложения.

Сам не очень-то рад такому решению. Приведу пример, для чего это мне нужно.
user posted image
То, что обведено красным - это то, что видят плагины. Указатель на IApplication они (плагины) получают при инициализации. Внутренняя структура CConcreteWindowXXX их волновать не должна, но некоторые операции над окнами они, всё же, делать могут.

Цитата(mes @  24.11.2010,  18:49 Найти цитируемый пост)
можно попросить помощи у шаблонов.

Что-то не соображу, как в такой ситуации просить помощи у шаблонов...

В общем, спасибо всем, я ещё подумаю над альтернативами, а если ничего не придумаю, то задисейблю.


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 24.11.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Cheloveck @  24.11.2010,  18:23 Найти цитируемый пост)
 а если ничего не придумаю, то задисейблю.

это угроза ?  smile  smile 

Цитата(Cheloveck @  24.11.2010,  18:23 Найти цитируемый пост)
Внутренняя структура CConcreteWindowXXX их волновать не должна, но некоторые операции над окнами они, всё же, делать могут.

а то, что Вы напрямую отражаете конкретные окна на интерфейсы, Вас не смущает ?
в общем создание линейки интерфейсов: IWindow, IWindowOne, IWindowTwo - не красивый прием.. 
если делаете интерфейсы, то их и делайте.. 




Это сообщение отредактировал(а) mes - 24.11.2010, 19:38


--------------------
PM MAIL WWW   Вверх
Cheloveck
Дата 24.11.2010, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(mes @  24.11.2010,  19:36 Найти цитируемый пост)
 что Вы напрямую отражаете конкретные окна на интерфейсы, Вас не смущает ?

На самом деле не на прямую, это просто так неудачно нарисовал

Цитата(mes @  24.11.2010,  19:36 Найти цитируемый пост)
это угроза ?

 smile 


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 24.11.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Cheloveck @  24.11.2010,  18:53 Найти цитируемый пост)
На самом деле не на прямую, 

даже если не напрямую, то такой подход, какой вы нарисовали, требует раза в три большего написания кода.. 





--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.