Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.07;
Скачать: CL | DM;

Вниз

С++ и Delphi по разному вызывают виртуальный метод в конструкторе   Найти похожие ветки 

 
Semin Aleksei   (2003-06-23 12:11) [0]

Имеем некий класс TMyClassA, который содержит виртуальный метод
VMethod. В конструкторе TMyClassA вызываем наш VMethod.
Теперь берем наследника от TMyClassA, пусть он будет TMyClassB.
В классе TMyClassB переписываем виртуальный метод VMethod.
А сейчас вопрос! Создадим TMyClassB. Как Вы думаете, какой код
будет выполнен в конструкторе? Код VMethod класса TMyClassA или код VMethod класса TMyClassB? Всегда думал, что второе (код класса TMyClassB), в общем, в Delphi так и есть. НО почему
в С++ все наоборот, т.е выполняется код класса TMyClassA?
PS
Данная особенность распространяется только на вызовы виртуальных
методов в конструкторе, в других случаях все работает одинаково.

Код на С++

class TMyClassA {
public:
TMyClassA()
{
VMethod();
}
virtual void VMethod()
{
printf("TMyClassA");
}
};

class TMyClassB: public TMyClassA {
public:
void VMethod()
{
printf("TMyClassB");
}
};

int main(int argc, char* argv[])
{
TMyClassB B;
return 0;
}


 
Dimka Maslov ©   (2003-06-23 12:23) [1]

В С++ конструктор - метод, вызываемый ДО создания таблицы виртуальных методов, а в Delphi - после. Поэтому при вызове виртуального метода в конструкторе в Delphi вызовется метод, переопределённый в потомке, а C++ - метод родительского класса. Вообще же в С++ и в Delphi реализованы различные подходы к ООП, по-


 
Dimka Maslov ©   (2003-06-23 12:27) [2]

особенно это проявляется в конструкторах и деструкторах объектов.
по-этому, если необходимо выполнять некие действия в момент создания объекта в С++ недо объявить виртуальный метод и вызывать его после конструктора:

TMyClassB *MyObjectB;
(MyObjectB = new TMyClassB).VMethod();
....
delete MyObjectB;


 
Semin Aleksei   (2003-06-23 12:30) [3]

Спасибо! Всегда думал, что подходы к ООП должны
быть одинаковы, особенно для таких монстров как PASCAL и C++.


 
Anatoly Podgoretsky ©   (2003-06-23 12:34) [4]

Почему, и кто договорится о реализации и что кроме этих двух языков других нет?


 
Dimka Maslov ©   (2003-06-23 12:55) [5]

На самом деле, сколько существует языков с поддержкой ООП, столько и различных подходов к его реализации, хотя основополагающие приниципы едины для всех.


 
vuk ©   (2003-06-23 14:26) [6]

to Dimka Maslov:
>а в Delphi - после
Угу. Точно. Особенно с учетом того, что VMT компилятором создается... :o)


 
Suntechnic ©   (2003-06-24 05:28) [7]

>Semin Aleksei
Да дело даже не в подходе к ООП... и VM тут абсолютно ни при чём... здесь обычная логика.
Если ты вспомнишь в какой последовательности вызываются конструкторы в С++, то ответ на вопрос данного поста будет тебе очевиден.
В С++ сначала вызывается конструтор базового класса, и только затем дочернего. А теперь представь себе имплементацию виртуального метода в дочернем классе, который оперирует полями объекта, который попросту ещё не создан и не проинициализирован (ведь конструктор дочернего класса вызовется только после того, как отработает конструктор базового класса, в котором ты как раз и вызываешь виртуальный метод).



Страницы: 1 вся ветка

Текущий архив: 2003.07.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-20190
Knight
2003-06-17 16:07
2003.07.07
Download для вебстраниц...


1-20104
Belkova
2003-06-24 13:47
2003.07.07
Projet Project1.exe raised class EOleSysError


4-20347
FallenGod
2003-05-05 18:41
2003.07.07
ф-ция setwindowhookex или о вторжении в чужу область памяти


1-20122
AndyNik
2003-06-23 21:01
2003.07.07
Запустить файл на исполнение.


1-20131
autootvetchik
2003-06-24 11:28
2003.07.07
HotKey в ActionList