Russian Qt Forum

Qt => Общие вопросы => Тема начата: Вадим от Март 25, 2005, 13:03



Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Вадим от Март 25, 2005, 13:03
Кто знает почему так?


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Sergeich от Март 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 версии и посмотри в отладчике.
З.Ы.
Если разберешься - отпишись, самому интересно


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Winstrol от Март 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();


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


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Sergeich от Март 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 и все его наследники не виртуальные.


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Zigmar от Март 27, 2005, 01:10
Цитата: "Sergeich"
Да, деструктор QObject виртуальный, однако деструкторы Qt-шных классов от которых наследуются сплошь и рядом, таких как QWidget и все его наследники не виртуальные.

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


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: lepsai от Март 27, 2005, 23:33
Цитировать
One virtual - virtual for ever, т.е. во всех наследуемых классов, даже если они этого явно не указывают. Учите С++.


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

ты понял, Сергеич?  :D


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Racheengel от Март 28, 2005, 10:04
хм... а что, таки Зигмар не прав? :)
это я насчет "virtual once-virtual forever".

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


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Sergeich от Март 28, 2005, 12:26
Цитата: "Racheengel"
хм... а что, таки Зигмар не прав? :)
это я насчет "virtual once-virtual forever".

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


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Racheengel от Март 29, 2005, 08:04
еще была бы фича в С++ - типа "закрытия" методов в производных классах - было б рулеззз :)


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: lepsai от Март 29, 2005, 10:43
Цитировать
еще была бы фича в С++ - типа "закрытия" методов в производных классах - было б рулеззз

это как?


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Racheengel от Март 29, 2005, 11:39
например, я хочу в производном классе "закрыть" несколько методов базового (чтобы их невозможно было вызвать). Можно, конечно, затолкать их в приваты... Но проще бы было ввести модификатор типа deprecated.


Название: Почему у большинства классов Qt деструкторы не виртуальные ?
Отправлено: Denwer от Апрель 01, 2005, 14:58
А чем тебя не устраивает закрытое наследование, и открытие тех методов которые нужно открыть? Эт первое. Дальше, по поводу введения новой фичи, так вот если комитет по стандартизации будет заботиться о каждом программисте на С++ то из этого языка получилась бы уже куча мусора, на котором программировать вообще нельзя. Для того что бы ввести что то новое, люди обдумывают это месяцами и годами, для того что бы не навредить данному языку. Кстати есть вещи намного нужнее данной, да тот же typeof и auto например.