Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt4.7] Наследование от чисто абстрактного класса


Автор: Remiznik 11.10.2011, 22:36
Суть проблемы. 
Есть чисто абстрактный класс, без Qt чистый  C++.
Код

class A 
{
   public:
         virtual  void metod_a1() =0;
         virtual  void metod_a2() =0;
         virtual ~A() =0;
}

от этого класса надо наследоваться, но в потомке мне нужны уже плюшки Qt типа сигналов. 

Такое возможно ? Предётся использовать множественное наследование ? 

Автор: borisbn 11.10.2011, 22:38
Цитата(Remiznik @  11.10.2011,  22:36 Найти цитируемый пост)
Такое возможно ? 

да
Цитата(Remiznik @  11.10.2011,  22:36 Найти цитируемый пост)
Предётся использовать множественное наследование ? 

да. QObject при этом нужно ставить первым

Автор: math64 12.10.2011, 08:22
Если по какой причине не подходит множественное наследование, можно сделать так:
Код

class B;
class B_Private : public QObject {
friend B;
Q_OBJECT
private:
 B_Private(B*parent);
public: ....
signals: ....
public slots: ....
private:
  B* parent;
};
class B : public A {
friend B_Private;
public:
  B() : priv(new B_Private(this)) {}
  bool connect(....) { return priv->connect(....); }
private:
B_Private* priv;
};

Автор: Remiznik 13.10.2011, 10:18
Получилось с множественным наследованием. Способ от math64 не понял.

Автор: math64 13.10.2011, 10:58
Цитата(Remiznik @  13.10.2011,  10:18 Найти цитируемый пост)
Получилось с множественным наследованием. Способ от math64 не понял. 

Такой способ может понадобиться если в наследуемом классе будут методы одноимённые с существующими в QObject, например virtual MyProperty* property(const char*);
Тогда создаются два класса, один наследуется от одного базового класса, другой от второго базового класса, они объявляются friend друг другу и имеют указатели друг на друга.
Для пользователя классов оставляется видимым только один, другой объявляется в приватном заголовке (аналогично сделано почти со всеми классами Qt, но в других целях, и открытым объявляется наследник QObject).
Для доступа к методам приватного класса в открытом создаются методы (обычно нет необходимости делать их виртуальными), которые вызывают методы приватного класса.
В данном случае при вызове connect открытого класса вызовется connect приватного класса и соединение будет со слотом приватного класса;
В самом слоте открытый класс будет доступен через указатель parent.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)