Russian Qt Forum
Сентябрь 30, 2024, 10:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Наследование  (Прочитано 5190 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Октябрь 02, 2013, 11:38 »

Задал абстрактный класс
Код
C++ (Qt)
class CLayer0
{
public:
   virtual int __fastcall  Init() = 0;
}
 
Затем делаю так
Код
C++ (Qt)
class CComm232 : public QObject,public CLayer0
{
   Q_OBJECT
 
public:
   explicit __fastcall CComm232(QObject*parent = 0);
   virtual __fastcall  ~CComm232();
   int __fastcall  Init();
}
 
Выдает ошибки:
Код:
 error: conflicting type attributes specified for 'virtual CComm232::~CComm232()'
 qobject.h:129: error:   overriding 'virtual QObject::~QObject()'

Почему, ведь вроде все норм???
« Последнее редактирование: Октябрь 02, 2013, 12:28 от demaker » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 02, 2013, 11:41 »

Объявите пустой виртуальный деструктор в CLayer0.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #2 : Октябрь 02, 2013, 11:44 »

А без него никак???
Наверное,да Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Октябрь 02, 2013, 11:51 »

А без него никак???
Fix Улыбающийся
« Последнее редактирование: Октябрь 02, 2013, 12:22 от Old » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #4 : Октябрь 02, 2013, 12:06 »

Сделал так, но не помогло
Код
C++ (Qt)
class CLayer0
{
public:
   virtual __fastcall ~CLayer0();
   virtual int __fastcall  Init() = 0;
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Октябрь 02, 2013, 12:12 »

Сделал так, но не помогло

Я на QObject внимания не обратил: у него виртуальный деструктор не объявлен как __fastcall, поэтому конфликт.

Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Октябрь 02, 2013, 12:28 »

 Улыбающийся точно
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Октябрь 02, 2013, 13:13 »

Зачем вообще этот __fastcall?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Октябрь 09, 2013, 10:36 »

Наследие от CBuilder вероятно )
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #9 : Октябрь 09, 2013, 10:56 »

MS компилятор (по крайней мере, 2010) тоже поддерживает __fastcall, которое является соглашением по вызову и требует от компилятора, по возможности, передавать аргументы для такой функции через регистры. Может иметь побочный эффект, связанный с декорированием имен (вместо _ добавляет @ перед именем функции).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Октябрь 09, 2013, 16:00 »

Насколько я помню, это паскалевское соглашение - стек выравнивает вызываемая ф-ция (а не вызывающий как в С). Однако это уже поросло мхом и приняло чисто ритуальный характер
Записан
Serr500
Гость
« Ответ #11 : Октябрь 09, 2013, 16:22 »

__fastcall - аргументы передаются в регистрах, если возможно, стек очищает функция.
__stdcall - аргументы передаются в стеке, стек очищает функция.
_cdecl - аргументы передаются в стеке, стек очищает вызывающий код.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.118 секунд. Запросов: 23.