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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему у большинства классов Qt деструкторы не виртуальные ?  (Прочитано 14113 раз)
Вадим
Гость
« : Март 25, 2005, 13:03 »

Кто знает почему так?
Записан
Sergeich
Гость
« Ответ #1 : Март 25, 2005, 17:02 »

Невиртуальные деструкторы в Qt используются когда:
1. предполагается что от класса не будут наследоватся
2. в классах - наследниках QObject
Во втором случае Qt как-то сама разбирается какой деструктор вызывать. Например если написать
Код:

class MyWidget : public QWidget
{
public:
MyWidget() : QWidget( 0, "MyWidget" ) { data = new char[128*1024*1024]; }
~MyWidget() {
qDebug( "In MyWidget::~MyWidget" );
delete[] data;
}
private:
char* data;
};

...........
MyWidget* mw = new MyWidget;
QWidget* w = mw;
delete w;

вызовется деструктор MyWidget, а не  QWidget, хотя QWidget::~QWidget не виртуальный.
Если тебе интересно как Qt это делает скомпиляй ее в debug версии и посмотри в отладчике.
З.Ы.
Если разберешься - отпишись, самому интересно
Записан
Winstrol
Гость
« Ответ #2 : Март 26, 2005, 19:05 »

Цитата: "Sergeich"
Невиртуальные деструкторы в Qt используются когда:
1. предполагается что от класса не будут наследоватся
2. в классах - наследниках QObject
Во втором случае Qt как-то сама разбирается какой деструктор вызывать.


Код:

class Q_EXPORT QObject: public Qt
{
    Q_OBJECT
    Q_PROPERTY( QCString name READ name WRITE setName )

public:
    QObject( QObject *parent=0, const char *name=0 );
    virtual ~QObject();


Ну вы даете, друзья.
Записан
Sergeich
Гость
« Ответ #3 : Март 26, 2005, 20:47 »

Цитата: "Winstrol"
Код:

class Q_EXPORT QObject: public Qt
{
    Q_OBJECT
    Q_PROPERTY( QCString name READ name WRITE setName )

public:
    QObject( QObject *parent=0, const char *name=0 );
    virtual ~QObject();


Ну вы даете, друзья.

Да, деструктор QObject виртуальный, однако деструкторы Qt-шных классов от которых наследуются сплошь и рядом, таких как QWidget и все его наследники не виртуальные.
Записан
Zigmar
Гость
« Ответ #4 : Март 27, 2005, 01:10 »

Цитата: "Sergeich"
Да, деструктор QObject виртуальный, однако деструкторы Qt-шных классов от которых наследуются сплошь и рядом, таких как QWidget и все его наследники не виртуальные.

QWidget насдудуется от QObject. Поскольку диструтор виртуальный в QObject, то он виртуальный и во всех классах, которые от него наследуются. Onсe virtual - virtual for ever, т.е. во всех наследуемых классов, даже если они этого явно не указывают. Учите С++.
Записан
lepsai
Гость
« Ответ #5 : Март 27, 2005, 23:33 »

Цитировать
One virtual - virtual for ever, т.е. во всех наследуемых классов, даже если они этого явно не указывают. Учите С++.


Ну если сам маэстро наказал... то мы, ламера тупые,  будем учить этот... как его?... c++...

ты понял, Сергеич?  Веселый
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Март 28, 2005, 10:04 »

хм... а что, таки Зигмар не прав? Улыбающийся
это я насчет "virtual once-virtual forever".

вообще ИМХО самый верных подход к виртуальности - это когда компилятор сам решает, стоит ли делать метод виртуальным или нет.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Sergeich
Гость
« Ответ #7 : Март 28, 2005, 12:26 »

Цитата: "Racheengel"
хм... а что, таки Зигмар не прав? Улыбающийся
это я насчет "virtual once-virtual forever".

Зигмар прав. Просто я забыл про эту фичу C++. Производный класс может только добавлять и заменять указатели в v-table, а удалить их оттуда он не может.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Март 29, 2005, 08:04 »

еще была бы фича в С++ - типа "закрытия" методов в производных классах - было б рулеззз Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
lepsai
Гость
« Ответ #9 : Март 29, 2005, 10:43 »

Цитировать
еще была бы фича в С++ - типа "закрытия" методов в производных классах - было б рулеззз

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Март 29, 2005, 11:39 »

например, я хочу в производном классе "закрыть" несколько методов базового (чтобы их невозможно было вызвать). Можно, конечно, затолкать их в приваты... Но проще бы было ввести модификатор типа deprecated.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Denwer
Гость
« Ответ #11 : Апрель 01, 2005, 14:58 »

А чем тебя не устраивает закрытое наследование, и открытие тех методов которые нужно открыть? Эт первое. Дальше, по поводу введения новой фичи, так вот если комитет по стандартизации будет заботиться о каждом программисте на С++ то из этого языка получилась бы уже куча мусора, на котором программировать вообще нельзя. Для того что бы ввести что то новое, люди обдумывают это месяцами и годами, для того что бы не навредить данному языку. Кстати есть вещи намного нужнее данной, да тот же typeof и auto например.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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