Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Октябрь 02, 2013, 11:38



Название: [Решено]Наследование
Отправлено: demaker от Октябрь 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()'

Почему, ведь вроде все норм???


Название: Re: Наследование
Отправлено: Old от Октябрь 02, 2013, 11:41
Объявите пустой виртуальный деструктор в CLayer0.


Название: Re: Наследование
Отправлено: demaker от Октябрь 02, 2013, 11:44
А без него никак???
Наверное,да :)


Название: Re: Наследование
Отправлено: Old от Октябрь 02, 2013, 11:51
А без него никак???
Fix :)


Название: Re: Наследование
Отправлено: demaker от Октябрь 02, 2013, 12:06
Сделал так, но не помогло
Код
C++ (Qt)
class CLayer0
{
public:
   virtual __fastcall ~CLayer0();
   virtual int __fastcall  Init() = 0;
}
 


Название: Re: Наследование
Отправлено: Old от Октябрь 02, 2013, 12:12
Сделал так, но не помогло

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



Название: Re: Наследование
Отправлено: demaker от Октябрь 02, 2013, 12:28
 :) точно


Название: Re: [Решено]Наследование
Отправлено: Пантер от Октябрь 02, 2013, 13:13
Зачем вообще этот __fastcall?


Название: Re: [Решено]Наследование
Отправлено: Fregloin от Октябрь 09, 2013, 10:36
Наследие от CBuilder вероятно )


Название: Re: [Решено]Наследование
Отправлено: Hellraiser от Октябрь 09, 2013, 10:56
MS компилятор (по крайней мере, 2010) тоже поддерживает __fastcall, которое является соглашением по вызову и требует от компилятора, по возможности, передавать аргументы для такой функции через регистры. Может иметь побочный эффект, связанный с декорированием имен (вместо _ добавляет @ перед именем функции).


Название: Re: [Решено]Наследование
Отправлено: Igors от Октябрь 09, 2013, 16:00
Насколько я помню, это паскалевское соглашение - стек выравнивает вызываемая ф-ция (а не вызывающий как в С). Однако это уже поросло мхом и приняло чисто ритуальный характер


Название: Re: [Решено]Наследование
Отправлено: Serr500 от Октябрь 09, 2013, 16:22
__fastcall - аргументы передаются в регистрах, если возможно, стек очищает функция.
__stdcall - аргументы передаются в стеке, стек очищает функция.
_cdecl - аргументы передаются в стеке, стек очищает вызывающий код.