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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Виртуальное наследование от класса Qt  (Прочитано 16988 раз)
Alf
Гость
« : Сентябрь 28, 2011, 12:58 »

Код
C++ (Qt)
class A : public QObject {...};
class B : public A, public QWidget {...};

При попытке использовать в реализации класса 'B' указатель на объект базового класса 'QObject' возникает неоднозначность, предок какого из классов (QWidget или A) должен быть использован ? Очевидно, необходимо виртуальное наследование.

Код
C++ (Qt)
class A : public virtual QObject {...};
Но как быть с QWidget ?

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 28, 2011, 13:11 »

Цитировать
Но как быть с QWidget ?
Никак  Грустный В Qt не позволительно множественное наследование от QObject.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #2 : Сентябрь 28, 2011, 13:18 »

Цитировать
Но как быть с QWidget ?
Никак  Грустный В Qt не позволительно множественное наследование от QObject.
а почему?
И где это написано?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 28, 2011, 13:25 »

Ну, хотя бы здесь.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 28, 2011, 13:47 »

Ну, хотя бы здесь.
Ну там не написано что нельзя  Улыбающийся Можно, но просто это ничего хорошего не дает. т.к. QObject не есть виртуальный базовый класс для QWidget и др
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Сентябрь 28, 2011, 14:40 »

Множественное наследование от кьюобжектов не поддерживает мок
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #6 : Сентябрь 28, 2011, 15:03 »

попробуй выделить какой-то общий интерфейс или класс (естественно не наследник QObject) и унаследовать оба своих класса от него
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #7 : Сентябрь 28, 2011, 18:28 »

Ну там не написано что нельзя  Улыбающийся Можно, но просто это ничего хорошего не дает. т.к. QObject не есть виртуальный базовый класс для QWidget и др
эти две фразы:
Цитировать
только один из предков может быть наследником QObject
- отсюда
Цитировать
The QWidget class is the base class of all user interface objects. More...
 #include <QWidget>
Inherits: QObject and QPaintDevice.
- отсюда

говорят мне что где то вы неправы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 28, 2011, 18:56 »

эти две фразы:
...
говорят мне что где то вы неправы.
А может проверим? (а не только будем запоминать чужие фразы  Улыбающийся)

Код
C++ (Qt)
#include <QtGui>
 
struct Test1 : virtual public QObject {
int mData1;
};
 
struct Test2 : virtual public QObject {
int mData2;
};
 
struct Test3 : public Test1, public Test2 {
int mData3;
};
 
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Test3 test3;
test3.mData1 = 1;
test3.mData2 = 2;
test3.mData3 = 3;
 
Test1 * test1 = (Test1 *) &test3;
Test2 * test2 = (Test2 *) &test3;
QObject * base1 = dynamic_cast<QObject *> (test1);
QObject * base2 = dynamic_cast<QObject *> (test2);
QObject * base3 = dynamic_cast<QObject *> (&test3);
printf("test1 = %p, base1 = %p\n"
  "test2 = %p, base2 = %p\n"
  "test3 = %p, base3 = %p\n",
test1, base1,
test2, base2,
&test3, base3);
 
return 0;
}
 
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Сентябрь 28, 2011, 19:02 »

эти две фразы:
говорят мне что где то вы неправы.
Не вижу противоречия. QPaintDevice от QObject не наследуется.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #10 : Сентябрь 29, 2011, 09:32 »

А может проверим? (а не только будем запоминать чужие фразы  Улыбающийся)
А может будем отвечать на посты в контексте ?
А может будем рассматривать код, приведенный топикстартером, а не выдумывать сферические тесты?
Записан
andrew.k
Гость
« Ответ #11 : Сентябрь 29, 2011, 10:01 »

То что этот примитивный абстрактный пример компилится и работает. Это ничего еще не значит.
Синтаксически с ним все в порядке.

Проблемы могут возникнуть в более сложных классах с сигналами и слотами.
Это видимо ограничение метаобъектной системы qt. Иначе об этом не было бы написано.
Нельзя значит нельзя. Что тут обсуждать?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Сентябрь 29, 2011, 17:08 »

"Виртуальное наследование с помощью QObject не поддерживается."
Тыц
Записан

Юра.
andrew.k
Гость
« Ответ #13 : Сентябрь 29, 2011, 17:17 »

"Виртуальное наследование с помощью QObject не поддерживается."
Тыц
Ты выдернул из контекста.
Прочитай целиком тему.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #14 : Сентябрь 29, 2011, 17:53 »

>>Прочитай целиком тему.
За каким чёртом?

Код
C++ (Qt)
class A : public QObject {...};
class B : public A, public QWidget {...};
QWidget - наследник QObject, а виртуальное наследование QObject не поддерживается.
Записан

Юра.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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