Текущий архив: 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.46 MB
Время: 0.006 c